home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / ZMSC0.HAS < prev    next >
Text File  |  1997-08-28  |  264KB  |  11,680 lines

  1. *-------------------------------------------------------
  2. *
  3. *           A ♪SOUND mind in a SOUND body
  4. *
  5. *           ZMUSIC.X Version 3.0
  6. *
  7. *         Programmed by Z.Nishikawa
  8. *
  9. *-------------------------------------------------------
  10.     .cpu        68000
  11.     .nlist
  12.     .include    doscall.mac
  13.     .include    iocscall.mac
  14.     .include    dma.mac
  15.     .include    z_global.mac
  16.     .include    table.mac
  17.     .include    label.mac
  18.     .include    macro.s
  19.     .include    error.mac
  20.     .include    zmd.mac
  21.     .include    zmid.mac
  22.     .include    zmcall.mac
  23.     .include    mpcmcall.mac
  24.     .list
  25.     .text
  26.     .lall
  27.  
  28. begin_of_prog:
  29. device_driver0:
  30.     dc.l    dev_header1
  31.     dc.w    $8020            *char,ioctrl不可,raw
  32.     dc.l    strategy_entry0
  33.     dc.l    interrupt_entry0
  34. dev_name0:
  35.     dc.b    'ZMS     '
  36. pack_ptr0:
  37.     dc.l    0
  38. func_tbl0:
  39.     dc.l    dev_init-func_tbl0    *0  初期化
  40.     dc.l    not_com-func_tbl0    *1  エラー
  41.     dc.l    not_com-func_tbl0    *2  無効
  42.     dc.l    not_com-func_tbl0    *3  (ioctrlによる入力)
  43.     dc.l    not_com-func_tbl0    *4  (入力)
  44.     dc.l    ok_com-func_tbl0    *5  1バイト先読み入力
  45.     dc.l    ok_com-func_tbl0    *6  入力ステータスチェック
  46.     dc.l    ok_com-func_tbl0    *7  入力バッファクリア
  47.     dc.l    dev_out-func_tbl0    *8  出力(verify off)
  48.     dc.l    dev_out-func_tbl0    *9  出力(verify on)
  49.     dc.l    ok_com-func_tbl0    *10 出力ステータスチェック
  50.     dc.l    ok_com-func_tbl0    *11 無効
  51.     dc.l    not_com-func_tbl0    *12 ioctrlによる出力
  52.  
  53. interrupt_entry0:
  54.     movem.l    d0/a4-a5,-(sp)
  55.     movea.l    pack_ptr0(pc),a5
  56.     moveq.l    #0,d0            *d0.l=com code
  57.     move.b    2(a5),d0
  58.     add.w    d0,d0
  59.     add.w    d0,d0
  60.     move.l    func_tbl0(pc,d0.w),d0
  61.     jsr    func_tbl0(pc,d0.l)    *jump tableで参照したところへ…
  62.     move.b    d0,3(a5)        *終了ステータスをセット
  63.     lsr.w    #8,d0
  64.     move.b    d0,4(a5)
  65.     movem.l    (sp)+,d0/a4-a5
  66.     rts
  67.  
  68. dev_header1:
  69.     dc.l    dev_header2
  70.     dc.w    $c020            *char,ioctrl可,raw
  71.     dc.l    strategy_entry1
  72.     dc.l    interrupt_entry1
  73. dev_name1:
  74.     dc.b    'PCM     '
  75. pack_ptr1:
  76.     dc.l    0
  77. func_tbl1:
  78.     dc.w    ok_com-func_tbl1    *0  初期化
  79.     dc.w    not_com-func_tbl1    *1  エラー
  80.     dc.w    not_com-func_tbl1    *2  無効
  81.     dc.w    ioctrl_inp1-func_tbl1    *3  (ioctrlによる入力)
  82.     dc.w    pcmdev_inp1-func_tbl1    *4  (入力)
  83.     dc.w    ok_com-func_tbl1    *5  1バイト先読み入力
  84.     dc.w    ok_com-func_tbl1    *6  入力ステータスチェック
  85.     dc.w    ok_com-func_tbl1    *7  入力バッファクリア
  86.     dc.w    pcmdev_out1-func_tbl1    *8  出力(verify off)
  87.     dc.w    pcmdev_out1-func_tbl1    *9  出力(verify on)
  88.     dc.w    ok_com-func_tbl1    *10 出力ステータスチェック
  89.     dc.w    ok_com-func_tbl1    *11 無効
  90.     dc.w    ioctrl_out1-func_tbl1    *12 ioctrlによる出力
  91.  
  92. interrupt_entry1:
  93.     movem.l    d0/a4-a5,-(sp)
  94.     movea.l    pack_ptr1(pc),a5
  95.     moveq.l    #0,d0            *d0.l=com code
  96.     move.b    2(a5),d0
  97.     add.w    d0,d0
  98.     move.w    func_tbl1(pc,d0.w),d0
  99.     jsr    func_tbl1(pc,d0.w)    *jump tableで参照したところへ…
  100.     move.b    d0,3(a5)        *終了ステータスをセット
  101.     lsr.w    #8,d0
  102.     move.b    d0,4(a5)
  103.     movem.l    (sp)+,d0/a4-a5
  104.     rts
  105.  
  106. dev_header2:
  107.     dc.l    -1
  108.     dc.w    $8020
  109.     dc.l    strategy_entry2
  110.     dc.l    interrupt_entry2
  111. dev_name2:
  112.     dc.b    'MIDI    '
  113. pack_ptr2:
  114.     dc.l    0
  115. func_tbl2:
  116.     dc.w    ok_com-func_tbl2    *0  初期化
  117.     dc.w    not_com-func_tbl2    *1  エラー
  118.     dc.w    not_com-func_tbl2    *2  無効
  119.     dc.w    not_com-func_tbl2    *3  ioctrlによる入力
  120.     dc.w    not_com-func_tbl2    *4 入力
  121.     dc.w    not_com-func_tbl2    *5  1バイト先読み入力
  122.     dc.w    ok_com-func_tbl2    *6  入力ステータスチェック
  123.     dc.w    ok_com-func_tbl2    *7  入力バッファクリア
  124.     dc.w    dev_out_midi-func_tbl2    *8  出力(verify off)
  125.     dc.w    dev_out_midi-func_tbl2    *9  出力(verify on)
  126.     dc.w    ok_com-func_tbl2    *10 出力ステータスチェック
  127.     dc.w    ok_com-func_tbl2    *11 無効
  128.     dc.w    not_com-func_tbl2    *12 ioctrlによる出力
  129.  
  130. interrupt_entry2:            *MIDI生データ通信処理
  131.     movem.l    d0/a4-a5,-(sp)
  132.     movea.l    pack_ptr2(pc),a5
  133.     moveq.l    #0,d0            *d0.l=com code
  134.     move.b    2(a5),d0
  135.     add.w    d0,d0
  136.     move.w    func_tbl2(pc,d0.w),d0
  137.     jsr    func_tbl2(pc,d0.w)    *jump tableで参照したところへ…
  138.     move.b    d0,3(a5)        *終了ステータスをセット
  139.     lsr.w    #8,d0
  140.     move.b    d0,4(a5)
  141.     movem.l    (sp)+,d0/a4-a5
  142.     rts
  143.  
  144. strategy_entry0:
  145.     move.l    a5,pack_ptr0
  146.     rts
  147. strategy_entry1:
  148.     move.l    a5,pack_ptr1
  149.     rts
  150. strategy_entry2:
  151.     move.l    a5,pack_ptr2
  152.     rts
  153.  
  154. not_com:
  155.     move.w    #$5003,d0    *無視/中止,無効
  156.     rts
  157. ok_com:
  158.     clr.w    d0        *no error
  159.     rts
  160. *------------------------------------------------------------------------------
  161. *            演奏データ出力
  162. *------------------------------------------------------------------------------
  163. reg_zm_dev    reg    d1-d7/a0-a6
  164. dev_out:
  165.     * グローバルレジスタ d4        a4 a6
  166.     movem.l    reg_zm_dev,-(sp)
  167.     lea    work,a6
  168.     movea.l    14(a5),a4    *get buff. add.
  169.     move.l    18(a5),d4    *n bytes
  170.     beq    dev_out_end    *case:data length is 0
  171.     move.l    d4,-(sp)
  172.     pea    (a4)
  173.     DOS    _SETBLOCK
  174.     addq.w    #8,sp
  175. dev_out_chk:                *-Sでのエントリ
  176.     move.l    #dev_out_end,fnc_quit_addr-work(a6)    *エラー発生の対処時に
  177.     move.l    sp,sp_buf-work(a6)            *使用するパラメータを設定
  178.     move.w    #$7fff,fnc_no-work(a6)            *
  179.     cmpi.b    #$1a,(a4)        *ヘッダチェック
  180.     bls    exec_cmp        *コンパイルデータの実行
  181.     cmpi.l    #SMFHED,(a4)
  182.     beq    go_trans_smf
  183.  
  184.     jsr    stop_timer-work(a6)
  185.     jsr    all_key_off-work(a6)
  186.     move.l    #ID_ZMD,d3
  187.     jsr    free_mem2-work(a6)    *ZMDメモリブロックの解放
  188.     move.l    #0,d1            *errmax=0,no header,no err list
  189.     move.l    compiler_j(pc),d0
  190.     beq    nocompiler        *compilerはリンクされていないのでコンパイル不可能→終了
  191.     move.l    d0,a0
  192.     move.l    a4,a1            *source addr.
  193.     move.l    d4,d2            *source size
  194.     moveq.l    #1,d1            *no header,no err list,errmax=1
  195.     cmpi.b    #2,zmsc_mode-work(a6)
  196.     bne    @f
  197.     ori.w    #ZMC_V2,d1
  198. @@:
  199.     movem.l    d1-d7/a1-a6,-(sp)
  200.     jsr    (a0)            *compilerへ処理を移す
  201.     movem.l    (sp)+,d1-d7/a1-a6    *d0.l=0:no error, a0.l=OBJ pointer
  202.     tst.l    d0            *d0.l=n of errors
  203.     bne    dev_out_end_err        *a0.l=0 エラーが発生している
  204.     move.l    a0,d0
  205.     beq    dev_out_end_err
  206.     move.l    a0,-(sp)
  207.     moveq.l    #0,d2            *dummy size
  208.     lea    8(a0),a1
  209.     bsr    _play_zmd
  210.     move.l    (sp)+,a1
  211.     move.l    calc_total_j(pc),a0
  212.     movem.l    d1-d7/a1-a6,-(sp)
  213.     jsr    (a0)            *トータルステップなどの計算(x:a6)
  214.     movem.l    (sp)+,d1-d7/a1-a6
  215.     move.l    a0,a1            *>a0.l=エラーテーブル/結果テーブルの解放
  216.     jsr    free_mem        *エラーテーブル/結果テーブルの解放
  217. dev_out_end:                * < 通常終了
  218.     moveq.l    #0,d0
  219.     move.l    d0,sp_buf-work(a6)
  220.     movem.l    (sp)+,reg_zm_dev
  221.     rts
  222.  
  223. dev_out_error:            *なんらかのエラー
  224.     * < d0.l=error code
  225.     jsr    set_err_code-work(a6)
  226.     moveq.l    #0,d0
  227.     bsr    set_err_code        *set error code(dummy)
  228.     bsr    set_err_code        *set error code(dummy)
  229.     bsr    set_err_code        *set error code(dummy)
  230.     addq.l    #1,n_of_err-work(a6)
  231. dev_out_end_err:
  232.     jsr    play_beep-work(a6)
  233.     bra    dev_out_end
  234.  
  235. exec_cmp:                *コンパイルデータの実行(ここを変えたらexec_comn_cmdもかえる)
  236.     cmpi.l    #ZmuSiC0,(a4)        *$10,'Zmu'
  237.     bne    zmadpcm??
  238.     cmpi.l    #ZmuSiC1+v_code,4(a4)    *'Sic',version(.b)
  239.     bne    match_err
  240.  
  241.     jsr    stop_timer-work(a6)
  242.     jsr    all_key_off-work(a6)
  243.     move.l    #ID_ZMD,d3
  244.     jsr    free_mem2-work(a6)    *ZMDメモリブロックの解放
  245.  
  246.     st.b    play_bak_flg-work(a6)
  247.     lea    8(a4),a1        *address(header分足す)
  248.     subq.l    #8,d4            *headerの長さ分まとめて差し引く
  249.     ble    dev_out_end        *minus or zero
  250.     move.l    d4,d2            *size
  251.     bsr    _play_zmd
  252.     bra    dev_out_end
  253.  
  254. zmadpcm??:                *ZPDのケースか(V2)
  255.     cmpi.l    #ZPDV2_0,(a4)        *$10,'ZmA'
  256.     bne    zmadpcm3??
  257.     cmpi.l    #ZPDV2_1,4(a4)        *'dpCm'
  258.     bne    match_err
  259.  
  260.     move.l    #ID_ZPD,d3
  261.     jsr    free_mem2-work(a6)    *古いのを解放
  262.  
  263.     addq.w    #8,a4            *skip header
  264.     subq.l    #8,d4            *headerの長さ分まとめて差し引く
  265.     ble    dev_out_end        *minus or zero
  266.     move.l    d4,d2            *size
  267.     move.l    #ID_ZPD,d3        *employment
  268.     jsr    get_mem-work(a6)    *メモリ確保(>a0.l=address,>d2.l=modified size)
  269.     tst.l    d0
  270.     bmi    outmem_err
  271.     move.l    a0,a2
  272. @@:                    *バッファへ転送
  273.     move.l    (a4)+,(a0)+
  274.     subq.l    #4,d2
  275.     bne    @b
  276.     clr.b    zpd_last_fn+30-work(a6)    *ファイルネームキャッシュ無効化
  277.     bsr    set_adpcm_tbl_v2    *ブロックデータのインフォメーションをワークにセット
  278.     bra    dev_out_end
  279.  
  280. zmadpcm3??:                *ZPDのケースか(V3)
  281.     cmpi.l    #ZPDV3_0,(a4)        *$1a,'Zma'
  282.     bne    match_err
  283.     cmpi.l    #ZPDV3_1,4(a4)        *'DPcM'
  284.     bne    match_err
  285.  
  286.     move.l    #ID_ZPD,d3
  287.     jsr    free_mem2-work(a6)    *古いのを解放
  288.  
  289.     addq.w    #8,a4            *skip header
  290.     subq.l    #8,d4            *headerの長さ分まとめて差し引く
  291.     ble    dev_out_end        *minus or zero
  292.     move.l    d4,d2            *size
  293.     move.l    #ID_ZPD,d3        *employment
  294.     jsr    get_mem-work(a6)    *メモリ確保(>a0.l=address,>d2.l=modified size)
  295.     tst.l    d0
  296.     bmi    outmem_err
  297.     move.l    a0,a2
  298. @@:                    *バッファへ転送
  299.     move.l    (a4)+,(a0)+
  300.     subq.l    #4,d2
  301.     bne    @b
  302.     clr.b    zpd_last_fn+30-work(a6)    *ファイルネームキャッシュ無効化
  303.     bsr    set_adpcm_tbl_v3    *ブロックデータのインフォメーションをワークにセット
  304.     bra    dev_out_end
  305.  
  306. go_trans_smf:
  307. *    clr.b    mbd_last_fn-work(a6)    *ファイルネームキャッシュ無効化
  308.     move.l    a4,a1
  309.     move.l    d4,d2
  310.     moveq.l    #-1,d1            *current MIDI I/F
  311.     bsr    midi_transmission
  312.     bra    dev_out_end
  313.  
  314. outmem_err:
  315.     move.l    #ZM_GET_MEM*65536+OUT_OF_MEMORY,d0    *エラーを出したファンクション番号を持って帰る
  316.     bra    dev_out_error
  317.  
  318. match_err:            *ヘッダの不一致
  319.     move.l    #$7fff*65536+UNIDENTIFIED_FILE,d0
  320.     bra    dev_out_error
  321.  
  322. nocompiler:
  323.     move.l    #$7fff*65536+COMPILER_NOT_AVAILABLE,d0
  324.     bra    dev_out_error
  325.  
  326. pcmdev_inp1:                *PCMDRV.SYS処理
  327.     movem.l    d1-d2/a1,-(sp)
  328.     moveq.l    #$61,d0
  329.     bra    @f
  330. pcmdev_out1:
  331.     movem.l    d1-d2/a1,-(sp)
  332.     moveq.l    #0,d1
  333.     IOCS    _ADPCMMOD
  334.     moveq.l    #$60,d0
  335. @@:
  336.     move.l    $12(a5),d2        *length
  337.     move.l    $0e(a5),a1        *address
  338.     move.w    frqpan(pc),d1        *frq/pan
  339.     trap    #$0f
  340.     movem.l    (sp)+,d1-d2/a1
  341.     bra    ok_com
  342.  
  343. ioctrl_inp1:
  344.     IOCS    _ADPCMSNS
  345.     movea.l    $0e(a5),a4
  346.     move.b    d0,(a4)
  347.     bra    ok_com
  348.  
  349. ioctrl_out1:
  350.     movea.l    $0e(a5),a4
  351.     move.b    (a4)+,d0
  352.     lsl.w    #8,d0
  353.     move.b    (a4)+,d0
  354.     move.w    d0,frqpan
  355.     bra    ok_com
  356.  
  357. frqpan:    .dc.w    $0403
  358.  
  359. reg_midi_out:    reg    d1-d2/a1/a5-a6
  360. dev_out_midi:                *MIDI生データの出力
  361. nmdb0:                    *nmdb!!
  362.     tst.l    18(a5)            *check size
  363.     beq    ok_com
  364.     movem.l    reg_midi_out,-(sp)    *ここを変えたら-sの処理も変える
  365.     lea    work,a6
  366.     move.l    #1f,fnc_quit_addr-work(a6)    *エラー発生の対処時に
  367.     move.l    sp,sp_buf-work(a6)        *使用するパラメータを設定
  368.     move.w    #$7fff,fnc_no-work(a6)        *
  369.     move.l    14(a5),a1        *addr
  370.     move.l    18(a5),d2        *size
  371.     move.l    d2,-(sp)
  372.     pea    (a1)
  373.     DOS    _SETBLOCK
  374.     addq.w    #8,sp
  375. *    clr.b    mbd_last_fn-work(a6)    *ファイルネームキャッシュ無効化
  376.     cmpi.w    #$0d0a,(a1)
  377.     bne    @f
  378.     cmpi.b    #$1a,-1(a1,d2.l)    *終端記号チェック
  379.     bne    1f
  380.     moveq.l    #0,d2            *ascii case
  381. @@:
  382.     moveq.l    #-1,d1            *current MIDI I/F
  383.     bsr    midi_transmission
  384. exit_dev_out_midi:
  385.     clr.l    sp_buf-work(a6)
  386.     movem.l    (sp)+,reg_midi_out
  387.     bra    ok_com
  388. 1:                    *エラーケース
  389.     move.l    #$7fff*65536+UNIDENTIFIED_FILE,d0
  390.     jsr    set_err_code-work(a6)
  391.     moveq.l    #0,d0
  392.     bsr    set_err_code        *set error code(dummy)
  393.     bsr    set_err_code        *set error code(dummy)
  394.     bsr    set_err_code        *set error code(dummy)
  395.     addq.l    #1,n_of_err-work(a6)
  396.     jsr    play_beep-work(a6)
  397.     bra    exit_dev_out_midi
  398.  
  399. com_max:    equ    (m_job_tbl_end-m_job_tbl)/4-1    *MAXコマンドナンバー
  400. version_id:
  401.         dc.b    'ZmuSiC'    *ID
  402. ver_num:    dc.b    v_code        *ZMUSIC VERSION NUMBER
  403.         dc.b    v_code_+ver_type
  404.  
  405. Z_MUSIC_t3:    * trap #3でここに飛んでくる
  406.     * < d0.w=command number
  407.     * > d0,a0 (この仕様は変更出来ない)
  408.     * - d1-d7,a1-a6
  409. reglist    reg    d1-d7/a1-a6
  410.     movem.l    reglist,-(sp)
  411.     lea    work,a6
  412.     move.w    d0,fnc_no-work(a6)    *エラー発生時に使用
  413.     add.w    d0,d0
  414.     add.w    d0,d0
  415.     move.l    m_job_tbl(pc,d0.w),d0
  416.     beq    err_exit_Z_MUSIC_t3
  417.     move.l    d0,a0
  418.     move.w    $0034(a7),d0
  419.     ori.w    #$2000,d0
  420.     move.w    d0,sr_type-work(a6)            *SRを割り込み発生前に戻す時に使用
  421.     move.l    #exit_Z_MUSIC_t3,fnc_quit_addr-work(a6)    *エラー発生の対処時に
  422.     move.l    sp,sp_buf-work(a6)            *使用するパラメータを設定
  423.     jsr    (a0)
  424. exit_Z_MUSIC_t3:
  425.     ori.w    #$0700,sr
  426.     clr.l    sp_buf    *わざと'-work(a6)'をつけない(先のjsr (a0)でa6破壊の場合があるため)
  427.     movem.l    (sp)+,reglist
  428.     rte
  429. err_exit_Z_MUSIC_t3:
  430.     move.l    d0,a0            *a0=0
  431.     moveq.l    #-1,d0
  432.     bra    exit_Z_MUSIC_t3
  433.  
  434. m_job_tbl:
  435.         dc.l    m_init                *$00
  436.         dc.l    m_assign            *$01
  437. compiler_j:    dc.l    0                *$02
  438.         dc.l    m_vget                *$03
  439.         dc.l    m_vset                *$04
  440.         dc.l    0                *$05
  441.         dc.l    m_tempo                *$06
  442.         dc.l    set_timer_value            *$07
  443.         dc.l    m_play                *$08
  444.         dc.l    m_play2                *$09
  445.         dc.l    m_play_again            *$0a
  446.         dc.l    m_play_status            *$0b
  447.         dc.l    m_stop                *$0c
  448.         dc.l    m_cont                *$0d
  449.         dc.l    m_atoi                *$0e
  450.         dc.l    set_master_clock        *$0f
  451.         dc.l    play_zmd            *$10
  452.         dc.l    play_zmd_se            *$11
  453.         dc.l    se_play                *$12
  454.         dc.l    se_adpcm1            *$13
  455.         dc.l    se_adpcm2            *$14
  456.         dc.l    intercept_play            *$15
  457.         dc.l    current_midi_in            *$16
  458.         dc.l    current_midi_out        *$17
  459.         dc.l    midi_transmission        *$18
  460.         dc.l    exclusive            *$19
  461.         dc.l    0                *$1a
  462.         dc.l    set_eox_wait            *$1b
  463.         dc.l    midi_inp1            *$1c
  464.         dc.l    midi_out1            *$1d
  465.         dc.l    midi_rec            *$1e
  466.         dc.l    midi_rec_end            *$1f
  467.         dc.l    gs_reset            *$20
  468.         dc.l    gs_partial_reserve        *$21
  469.         dc.l    gs_reverb            *$22
  470.         dc.l    gs_chorus            *$23
  471.         dc.l    gs_part_setup            *$24
  472.         dc.l    gs_drum_setup            *$25
  473.         dc.l    gs_drum_name            *$26
  474.         dc.l    gs_print            *$27
  475.         dc.l    gs_display            *$28
  476.         dc.l    gm_system_on            *$29
  477.         dc.l    0                *$2a
  478.         dc.l    0                *$2b
  479.         dc.l    0                *$2c
  480.         dc.l    0                *$2d
  481.         dc.l    0                *$2e
  482.         dc.l    0                *$2f
  483.         dc.l    mt32_reset            *$30
  484.         dc.l    mt32_partial_reserve        *$31
  485.         dc.l    mt32_reverb            *$32
  486.         dc.l    mt32_part_setup            *$33
  487.         dc.l    mt32_drum_setup            *$34
  488.         dc.l    mt32_common            *$35
  489.         dc.l    mt32_partial            *$36
  490.         dc.l    mt32_patch            *$37
  491.         dc.l    mt32_print            *$38
  492.         dc.l    u220_setup            *$39
  493.         dc.l    u220_part_setup            *$3a
  494.         dc.l    u220_common            *$3b
  495.         dc.l    u220_timbre            *$3c
  496.         dc.l    u220_drum_setup            *$3d
  497.         dc.l    u220_drum_inst            *$3e
  498.         dc.l    u220_print            *$3f
  499.         dc.l    m1_setup            *$40
  500.         dc.l    m1_part_setup            *$41
  501.         dc.l    m1_effect_setup            *$42
  502.         dc.l    m1_print            *$43
  503.         dc.l    send_to_m1            *$44
  504.         dc.l    0                *$45
  505.         dc.l    sc88_mode_set            *$46
  506.         dc.l    sc88_reverb            *$47
  507.         dc.l    sc88_chorus            *$48
  508.         dc.l    sc88_delay            *$49
  509.         dc.l    sc88_equalizer            *$4a
  510.         dc.l    sc88_part_setup            *$4b
  511.         dc.l    sc88_drum_setup            *$4c
  512.         dc.l    sc88_drum_name            *$4d
  513.         dc.l    sc88_user_inst            *$4e
  514.         dc.l    sc88_user_drum            *$4f
  515.         dc.l    pcm_read            *$50
  516.         dc.l    register_zpd            *$51
  517.         dc.l    set_zpd_table            *$52
  518.         dc.l    convert_pcm            *$53
  519.         dc.l    exec_subfile            *$54
  520.         dc.l    transmit_midi_dump        *$55
  521.         dc.l    set_wave_form1            *$56
  522.         dc.l    set_wave_form2            *$57
  523.         dc.l    obtain_events            *$58
  524.         dc.l    loop_control            *$59
  525.         dc.l    mask_tracks            *$5a
  526.         dc.l    mask_channels            *$5b
  527.         dc.l    set_ch_output_level        *$5c
  528.         dc.l    set_tr_output_level        *$5d
  529.         dc.l    master_fader            *$5e
  530.         dc.l    get_fader_status        *$5f
  531.         dc.l    get_play_time            *$60
  532.         dc.l    get_1st_comment            *$61
  533.         dc.l    get_timer_mode            *$62
  534.         dc.l    get_track_table            *$63
  535.         dc.l    get_play_work            *$64
  536.         dc.l    get_buffer_information        *$65
  537.         dc.l    get_zmsc_status            *$66
  538. calc_total_j:    dc.l    0                *$67    calc_total
  539.         dc.l    application_releaser        *$68
  540.         dc.l    release_driver            *$69
  541.         dc.l    occupy_zmusic            *$6a
  542.         dc.l    hook_fnc_service        *$6b
  543.         dc.l    hook_zmd_service        *$6c
  544.         dc.l    0                *$6d    occupy_compiler
  545.         dc.l    store_error            *$6e
  546.         dc.l    print_error            *$6f
  547.         dc.l    get_mem                *$70
  548.         dc.l    enlarge_mem            *$71
  549.         dc.l    free_mem            *$72
  550.         dc.l    free_mem2            *$73
  551.         dc.l    exchange_memid            *$74
  552.         dc.l    0                *$75
  553.         dc.l    0                *$76
  554.         dc.l    0                *$77
  555.         dc.l    init_all            *$78
  556.         dc.l    int_start            *$79
  557.         dc.l    int_stop            *$7a
  558.         dc.l    set_int_service            *$7b
  559.         dc.l    control_tempo            *$7c
  560.         dc.l    0                *$7d
  561.         dc.l    zmusic_mode            *$7e
  562.         dc.l    exec_zmd            *$7f
  563. m_job_tbl_end:
  564.  
  565. init_cmn_wks    macro                    *PLAY等用
  566.     * x d0.l
  567.     moveq.l    #0,d0
  568.     move.l    d0,stat0-work(a6)
  569.     move.l    d0,statr0-work(a6)
  570.     move.l    d0,jump_flg1-work(a6)        *init jump flg1
  571.     move.l    d0,jump_flg2-work(a6)        *init jump flg2
  572.     move.l    d0,jump_flg3-work(a6)        *init jump flg3
  573.     move.l    #$0403_ffff,adpcm_frq-work(a6)    *adpcm_frq,adpcm_pan,adpb_clr,wvmm_clr
  574.     move.b    d0,zpd_last_fn+30-work(a6)    *ファイルネームキャッシュ無効化
  575.     endm
  576.  
  577. m_init:                            *イニシャライズ
  578.     *   cmd=$00
  579.     * < d1.l=0通常初期化,2:Ver.2.0モードへ,3:Ver.3.0モードへ
  580.     * > d0.l=Version ID
  581.     move.w    sr,-(sp)                *念のため
  582.     ori.w    #$700,sr
  583.     move.b    d1,-(sp)
  584.     bsr    m_stop_all                *演奏中ならまずそれを停止
  585.     jsr    all_key_off-work(a6)            *全消音
  586.     move.l    play_trk_tbl-work(a6),a1        *どのtrackがどのchannelへ
  587.     move.w    #-1,(a1)                *アサインされているかを初期化
  588.     bsr    init_mask_fader_work
  589.     jsr    init_play_wk-work(a6)            *演奏ワークの初期化
  590.     init_cmn_wks                    *共通ワーク初期化
  591.     bsr    init_opmwk                *FM音源のチャンネルワークの初期化
  592.     bsr    init_midiwk                *MIDIのチャンネルワークの初期化
  593. mpcm_patch0:
  594.     move.w    #M_INIT,d0                *MPCM初期化
  595.     MPCM_call
  596. _mpcm_patch0:
  597.     move.l    #ID_ERROR,d3                *エラーストック・クリア
  598.     jsr    free_mem2-work(a6)
  599.     moveq.l    #0,d0
  600.     move.w    ver_num(pc),d0
  601.     move.b    (sp)+,d1
  602.     cmpi.b    #2,d1
  603.     beq    @f
  604.     cmpi.b    #3,d1
  605.     bne    1f
  606. @@:
  607.     jsr    zmusic_mode-work(a6)
  608. 1:
  609.     move.w    (sp)+,sr
  610.     rts
  611.  
  612. init_mask_fader_work:                    *マスク/フェーダー関連ワークの初期化
  613.     * x d0,d1,a4
  614.     move.l    mask_preserve-work(a6),d0        *d0=0 or $00ff0000($ff on p_mask_mode)
  615.     bne    @f
  616.     move.l    d0,ch_mask_fm-work(a6)            *6つのデバイスワークをまとめて初期化
  617.     move.l    d0,ch_mask_m0-work(a6)
  618.     move.l    d0,ch_mask_mr0-work(a6)
  619. @@:
  620. *    andi.b    #(.not.ff_ch_fader),fader_flag-work(a6)    *ch_fader 終了
  621.     clr.b    fader_flag-work(a6)            *ch_fader & master_fader終了
  622.     st.b    ch_fader_tbl-work(a6)            *ch_fader
  623.     st.b    master_fader_tbl-work(a6)        *master_fader
  624.     lea    fm_vol_tbl-work(a6),a4            *まとめてfm_vol_tbl~mr1_vol_tbl
  625.     moveq.l    #-1,d0                    *までを初期化する(フェーダー系ワーク)
  626.     moveq.l    #(if_max+2)*16/4-1,d1            *+2はFMとADPCMのチャンネル分
  627. @@:
  628.     move.l    d0,(a4)+
  629.     dbra    d1,@b
  630.     rts
  631.  
  632. m_assign:            *チャンネルアサイン
  633.     *   cmd=$01
  634.     * < d1.l=ch_number
  635.     * <       .hw=type    (0,1,$8000,$8001,$8002,-1:current)
  636.     * <       .lw=ch    (0-15)
  637.     * < d2.l=trk_number(0-65534)
  638.     * > error code
  639.     move.l    d1,d0
  640.     swap    d0
  641.     tst.w    d0        *d0.w=type
  642.     bmi    mas_midi
  643.     bne    mas_adpcm
  644.     cmpi.w    #7,d1        *FMチャンネルの最大値をチェック
  645.     bls    mas_trchk
  646.     bra    t_illegal_channel
  647. mas_midi:            *MIDIチャンネルの最大値をチェック
  648.     cmpi.w    #-1,d0
  649.     bne    @f
  650.     swap    d1            *カレント使用ケース
  651.     move.w    current_midi_out_w-work(a6),d1
  652.     lsr.w    #1,d1
  653.     ori.w    #$8000,d1
  654.     swap    d1
  655. @@:
  656.     cmpi.w    #$0f,d1
  657.     bls    mas_trchk
  658.     bra    t_illegal_channel
  659. mas_adpcm:            *ADPCMチャンネルの最大値をチェック
  660.     cmpi.w    #adpcm_ch_max-1,d1
  661.     bhi    t_illegal_channel
  662. mas_trchk:
  663.     cmpi.w    #tr_max-1,d2
  664.     bhi    t_illegal_track_number
  665.     calc_wk    d2
  666.     move.l    d1,p_type(a5)
  667.                 *play_trk_tblへトラック登録
  668.     * < d2=trk number
  669.     * - all
  670.     move.l    play_trk_tbl-work(a6),a1
  671.     moveq.l    #pl_max-1,d1
  672. @@:
  673.     move.w    (a1)+,d0
  674.     cmpi.w    #-1,d0
  675.     beq    @f        *トラック番号をセット
  676.     cmp.w    d2,d0        *既に同じ物がアサイン済か
  677.     beq    t_dat_ok
  678.     dbra    d1,@b
  679. @@:
  680.     move.w    #-1,(a1)
  681.     move.w    d2,-(a1)
  682.     t_dat_ok
  683.  
  684. *compiler:                *COMPILE
  685.     *   cmd=$02
  686.     * < d1.l=mode
  687.     *    d0-d6:検出するエラーの最大/0:∞,1-127
  688.     *    d15:エラーテーブルリストを作成して出力するか(0:no,1:yes)
  689.     * < d2.l=size
  690.     * < a1.l=source address    (a1=d2=0でコンパイラ解除)
  691.     *-------
  692.     * > d0.l=num. of error
  693.     * > a0.l=error table (if required/to be free)
  694.     *    (error code.w,error line.l)
  695.     *-------
  696.     * > d0.l=0:no error
  697.     * > a0.l=object address
  698.     *   0(a0)~15(a0)=ZMD standard header(if required)
  699.     *   8(a0)~ZMD
  700.     *   (ウォーニングがあればZMDデータの後ろにくっついている)
  701.     *------- release compiler case
  702.     * > d0.l=0:no error/nz error
  703.  
  704. m_vget:                *ボイスゲット
  705.     *   cmd=$03
  706.     * < d1.l=timbre number(0-32767)
  707.     * < d2.l=mode(0:normal,1:AL/FB)
  708.     * < a1.l=destination data address(80bytes)
  709.     cmpi.l    #fmsnd_reg_max-1,d1
  710.     bhi    t_illegal_timbre_number
  711.     cmp.w    fmsnd_n_max-work(a6),d1
  712.     bcc    t_illegal_timbre_number
  713.  
  714.     lsl.l    #4,d1
  715.     move.l    d1,d0
  716.     add.l    d1,d1
  717.     add.l    d0,d1        *48倍
  718.     movea.l    fmsnd_buffer-work(a6),a2
  719.     adda.l    d1,a2
  720.     tst.w    (a2)+
  721.     beq    t_no_timbre_parameters
  722.     tst.l    d2
  723.     bne    m_vget2
  724.  
  725.     move.b    (a2)+,$04(a1)    *0)LFRQ
  726.  
  727.     move.b    (a2)+,d0
  728.     and.b    #$7f,d0
  729.     move.b    d0,$05(a1)    *1)PMD
  730.  
  731.     move.b    (a2)+,d0
  732.     andi.b    #127,d0
  733.     move.b    d0,$06(a1)    *2)AMD
  734.                 *3)SYNC/OM/WF
  735.     move.b    (a2)+,d0
  736.     bpl    @f
  737.     move.b    #1,$03(a1)    *SYNC=1
  738.     bra    gtv_wf
  739. @@:
  740.     clr.b    $03(a1)        *SYNC=0
  741. gtv_wf:
  742.     move.b    d0,d1
  743.     andi.b    #3,d1
  744.     move.b    d1,$02(a1)    *WF
  745.     andi.b    #%0111_1000,d0
  746.     lsr.b    #3,d0
  747.     move.b    d0,$01(a1)    *OM
  748.  
  749.     move.b    (a2)+,d0    *4)
  750.     move.b    d0,d1
  751.     rol.b    #2,d1
  752.     andi.b    #3,d1
  753.     move.b    d1,$09(a1)    *PAN
  754.     andi.b    #%0011_1111,d0
  755.     move.b    d0,(a1)        *AF
  756.  
  757.     move.b    (a2)+,d0    *5)
  758.     move.b    d0,d1
  759.     lsr.b    #4,d1
  760.     andi.b    #7,d1
  761.     move.b    d1,$07(a1)    *PMS
  762.     andi.b    #3,d0
  763.     move.b    d0,$08(a1)    *AMS
  764. ************************************************
  765. op_param_gv:
  766.     move.b    (a2)+,d0    *6)OP1:DT1/MUL
  767.     move.b    d0,d1
  768.     lsr.b    #4,d1
  769.     andi.b    #7,d1
  770.     move.b    d1,$13(a1)    *DT1
  771.     andi.b    #15,d0
  772.     move.b    d0,$12(a1)    *MUL
  773.  
  774.     move.b    (a2)+,d0    *7)OP3:DT1/MUL
  775.     move.b    d0,d1
  776.     lsr.b    #4,d1
  777.     andi.b    #7,d1
  778.     move.b    d1,$29(a1)    *DT1
  779.     andi.b    #15,d0
  780.     move.b    d0,$28(a1)    *MUL
  781.  
  782.     move.b    (a2)+,d0    *8)OP2:DT1/MUL
  783.     move.b    d0,d1
  784.     lsr.b    #4,d1
  785.     andi.b    #7,d1
  786.     move.b    d1,$1e(a1)    *DT1
  787.     andi.b    #15,d0
  788.     move.b    d0,$1d(a1)    *MUL
  789.  
  790.     move.b    (a2)+,d0    *9)OP4:DT1/MUL
  791.     move.b    d0,d1
  792.     lsr.b    #4,d1
  793.     andi.b    #7,d1
  794.     move.b    d1,$34(a1)    *DT1
  795.     andi.b    #15,d0
  796.     move.b    d0,$33(a1)    *MUL
  797. ************************************************
  798.     move.b    (a2)+,$10(a1)    *10)OP1:TL
  799.     move.b    (a2)+,$26(a1)    *11)OP3:TL
  800.     move.b    (a2)+,$1b(a1)    *12)OP2:TL
  801.     move.b    (a2)+,$31(a1)    *13)OP4:TL
  802.  
  803.     move.b    (a2)+,d0    *14)OP1:KS/AR
  804.     move.b    d0,d1
  805.     andi.b    #31,d1
  806.     move.b    d1,$0b(a1)    *AR
  807.     rol.b    #2,d0
  808.     andi.b    #3,d0
  809.     move.b    d0,$11(a1)    *KS
  810.  
  811.     move.b    (a2)+,d0    *15)OP3:KS/AR
  812.     move.b    d0,d1
  813.     andi.b    #31,d1
  814.     move.b    d1,$21(a1)    *AR
  815.     rol.b    #2,d0
  816.     andi.b    #3,d0
  817.     move.b    d0,$27(a1)    *KS
  818.  
  819.     move.b    (a2)+,d0    *16)OP2:KS/AR
  820.     move.b    d0,d1
  821.     andi.b    #31,d1
  822.     move.b    d1,$16(a1)    *AR
  823.     rol.b    #2,d0
  824.     andi.b    #3,d0
  825.     move.b    d0,$1c(a1)    *KS
  826.  
  827.     move.b    (a2)+,d0    *17)OP4:KS/AR
  828.     move.b    d0,d1
  829.     andi.b    #31,d1
  830.     move.b    d1,$2c(a1)    *AR
  831.     rol.b    #2,d0
  832.     andi.b    #3,d0
  833.     move.b    d0,$32(a1)    *KS
  834. ************************************************
  835.     move.b    (a2)+,d0    *18)OP1:AME/1DR
  836.     move.b    d0,d1
  837.     andi.b    #31,d1
  838.     move.b    d1,$0c(a1)    *1DR
  839.     rol.b    #1,d0
  840.     andi.b    #1,d0
  841.     move.b    d0,$15(a1)    *AME
  842.  
  843.     move.b    (a2)+,d0    *19)OP3:AME/1DR
  844.     move.b    d0,d1
  845.     andi.b    #31,d1
  846.     move.b    d1,$22(a1)    *1DR
  847.     rol.b    #1,d0
  848.     andi.b    #1,d0
  849.     move.b    d0,$2b(a1)    *AME
  850.  
  851.     move.b    (a2)+,d0    *20)OP2:AME/1DR
  852.     move.b    d0,d1
  853.     andi.b    #31,d1
  854.     move.b    d1,$17(a1)    *1DR
  855.     rol.b    #1,d0
  856.     andi.b    #1,d0
  857.     move.b    d0,$20(a1)    *AME
  858.  
  859.     move.b    (a2)+,d0    *21)OP4:AME/1DR
  860.     move.b    d0,d1
  861.     andi.b    #31,d1
  862.     move.b    d1,$2d(a1)    *1DR
  863.     rol.b    #1,d0
  864.     andi.b    #1,d0
  865.     move.b    d0,$36(a1)    *AME
  866. ************************************************
  867.     move.b    (a2)+,d0    *22)OP1:DT2/2DR
  868.     move.b    d0,d1
  869.     andi.b    #31,d1
  870.     move.b    d1,$0d(a1)    *2DR
  871.     rol.b    #2,d0
  872.     andi.b    #3,d0
  873.     move.b    d0,$14(a1)    *DT2
  874.  
  875.     move.b    (a2)+,d0    *23)OP3:DT2/2DR
  876.     move.b    d0,d1
  877.     andi.b    #31,d1
  878.     move.b    d1,$23(a1)    *2DR
  879.     rol.b    #2,d0
  880.     andi.b    #3,d0
  881.     move.b    d0,$2a(a1)    *DT2
  882.  
  883.     move.b    (a2)+,d0    *24)OP2:DT2/2DR
  884.     move.b    d0,d1
  885.     andi.b    #31,d1
  886.     move.b    d1,$18(a1)    *2DR
  887.     rol.b    #2,d0
  888.     andi.b    #3,d0
  889.     move.b    d0,$1f(a1)    *DT2
  890.  
  891.     move.b    (a2)+,d0    *25)OP4:DT2/2DR
  892.     move.b    d0,d1
  893.     andi.b    #31,d1
  894.     move.b    d1,$2e(a1)    *2DR
  895.     rol.b    #2,d0
  896.     andi.b    #3,d0
  897.     move.b    d0,$35(a1)    *DT2
  898. ************************************************
  899.     move.b    (a2)+,d0    *26)OP1:D1L/RR
  900.     move.b    d0,d1
  901.     andi.b    #15,d1
  902.     move.b    d1,$0e(a1)    *RR
  903.     lsr.b    #4,d0
  904.     move.b    d0,$0f(a1)    *D1L
  905.  
  906.     move.b    (a2)+,d0    *27)OP3:D1L/RR
  907.     move.b    d0,d1
  908.     andi.b    #15,d1
  909.     move.b    d1,$24(a1)    *RR
  910.     lsr.b    #4,d0
  911.     move.b    d0,$25(a1)    *D1L
  912.  
  913.     move.b    (a2)+,d0    *28)OP2:D1L/RR
  914.     move.b    d0,d1
  915.     andi.b    #15,d1
  916.     move.b    d1,$19(a1)    *RR
  917.     lsr.b    #4,d0
  918.     move.b    d0,$1a(a1)    *D1L
  919.  
  920.     move.b    (a2)+,d0    *29)OP4:D1L/RR
  921.     move.b    d0,d1
  922.     andi.b    #15,d1
  923.     move.b    d1,$2f(a1)    *RR
  924.     lsr.b    #4,d0
  925.     move.b    d0,$30(a1)    *D1L
  926. ************************************************
  927.     lea    55(a1),a1
  928.     moveq.l    #fmsndname_len-1,d0    *音色名の最大長
  929. @@:                *音色名転送
  930.     move.b    (a2)+,(a1)+
  931.     dbeq    d0,@b
  932.     t_dat_ok
  933.  
  934. m_vget2:                *AL/FB分離方式
  935.     * < d1.l=offset
  936.     * < a2.l=fmsnd_buffer
  937.     move.l    a1,a0            *保存
  938.     move.l    a2,a3            *use later
  939.     addq.w    #6,a2            *op_paramを収納
  940.     lea    -11(a1),a1        *-11はつじつま合わせ
  941.     bsr    op_param_gv
  942.  
  943.     move.b    (a3)+,50(a0)        *0)LFRQ
  944.  
  945.     move.b    (a3)+,d0
  946.     andi.b    #127,d0
  947.     move.b    d0,51(a0)        *1)PMD
  948.  
  949.     move.b    (a3)+,d0
  950.     andi.b    #127,d0
  951.     move.b    d0,52(a0)        *2)AMD
  952.                     *3)SYNC/OM/WF
  953.     move.b    (a3)+,d0
  954.     bpl    @f
  955.     move.b    #1,49(a0)        *SYNC=1
  956.     bra    gtv2_wf
  957. @@:
  958.     clr.b    49(a0)            *SYNC=0
  959. gtv2_wf:
  960.     move.b    d0,d1
  961.     andi.b    #3,d1
  962.     move.b    d1,48(a0)        *WF
  963.     andi.b    #%0111_1000,d0
  964.     lsr.b    #3,d0
  965.     move.b    d0,46(a0)        *OM
  966.  
  967.     move.b    (a3)+,d0        *4)PAN/AF
  968.     move.b    d0,d1
  969.     rol.b    #2,d1
  970.     andi.b    #3,d1
  971.     move.b    d1,47(a0)        *PAN
  972.  
  973.     move.b    d0,d1
  974.     lsr.b    #3,d1
  975.     andi.b    #7,d1
  976.     move.b    d1,45(a0)        *FB
  977.  
  978.     andi.b    #7,d0
  979.     move.b    d0,44(a0)        *AL
  980.  
  981.     move.b    (a3)+,d0        *5)
  982.     move.b    d0,d1
  983.     lsr.b    #4,d1
  984.     andi.b    #7,d1
  985.     move.b    d1,53(a0)        *PMS
  986.     andi.b    #3,d0
  987.     move.b    d0,54(a0)        *AMS
  988.     t_dat_ok
  989.  
  990. m_vset:                *ボイスセット
  991.     *   cmd=$04
  992.     * < d1.l=timbre number(0-32767)
  993.     * < d2.l=mode(0:normal,1:AL/FB,-1:ZMD形式)
  994.     * < a1.l=parameters' data address
  995.     cmpi.l    #fmsnd_reg_max-1,d1
  996.     bhi    t_illegal_timbre_number
  997.     cmp.w    fmsnd_n_max-work(a6),d1
  998.     bcs    @f
  999.     bsr    spread_fmsnd_n
  1000.     bmi    t_out_of_memory
  1001. @@:
  1002.     lsl.l    #4,d1
  1003.     move.l    d1,d0
  1004.     add.l    d1,d1
  1005.     add.l    d0,d1        *48倍
  1006.     movea.l    fmsnd_buffer-work(a6),a2
  1007.     adda.l    d1,a2
  1008.     move.w    #fmsnd_exists,(a2)+    *existance mark
  1009.  
  1010.     tst.l    d2
  1011.     bmi    m_vset_zmd        *ZMD形式へ
  1012.     bne    m_vset2            *AL/FB分離方式へ
  1013.  
  1014.     move.b    $04(a1),(a2)+    *0)LFRQ
  1015.  
  1016.     move.b    $05(a1),d0    *1)PMD
  1017.     tas.b    d0
  1018.     move.b    d0,(a2)+
  1019.  
  1020.     move.b    $06(a1),d0    *2)AMD
  1021.     andi.b    #127,d0
  1022.     move.b    d0,(a2)+
  1023.                 *3)SYNC/OM/WF
  1024.     move.b    $01(a1),d0    *OM
  1025.     andi.b    #$0f,d0
  1026.     lsl.b    #3,d0
  1027.     tst.b    $03(a1)        *SYNC
  1028.     beq    @f
  1029.     tas.b    d0
  1030. @@:
  1031.     move.b    $02(a1),d1    *WF
  1032.     andi.b    #3,d1
  1033.     or.b    d1,d0
  1034.     move.b    d0,(a2)+
  1035.  
  1036.     move.b    $09(a1),d0    *PAN
  1037.     andi.b    #3,d0
  1038.     ror.b    #2,d0
  1039.     move.b    (a1),d1
  1040.     andi.b    #%0011_1111,d1
  1041.     or.b    d1,d0        *AF
  1042.     move.b    d0,(a2)+    *4)PAN/AF
  1043.  
  1044.     move.b    $07(a1),d0    *PMS
  1045.     andi.b    #7,d0
  1046.     lsl.b    #4,d0
  1047.     move.b    $08(a1),d1    *AMS
  1048.     andi.b    #3,d1
  1049.     or.b    d1,d0
  1050.     move.b    d0,(a2)+    *5)
  1051. ************************************************
  1052. op_param:
  1053.     move.b    $13(a1),d0    *DT1
  1054.     andi.b    #7,d0
  1055.     lsl.b    #4,d0
  1056.     move.b    $12(a1),d1    *MUL
  1057.     andi.b    #15,d1
  1058.     or.b    d1,d0
  1059.     move.b    d0,(a2)+    *6)OP1:DT1/MUL
  1060.  
  1061.     move.b    $29(a1),d0    *DT1
  1062.     andi.b    #7,d0
  1063.     lsl.b    #4,d0
  1064.     move.b    $28(a1),d1    *MUL
  1065.     andi.b    #15,d1
  1066.     or.b    d1,d0
  1067.     move.b    d0,(a2)+    *7)OP3:DT1/MUL
  1068.  
  1069.     move.b    $1e(a1),d0    *DT1
  1070.     andi.b    #7,d0
  1071.     lsl.b    #4,d0
  1072.     move.b    $1d(a1),d1    *MUL
  1073.     andi.b    #15,d1
  1074.     or.b    d1,d0
  1075.     move.b    d0,(a2)+    *8)OP2:DT1/MUL
  1076.  
  1077.     move.b    $34(a1),d0    *DT1
  1078.     andi.b    #7,d0
  1079.     lsl.b    #4,d0
  1080.     move.b    $33(a1),d1    *MUL
  1081.     andi.b    #15,d1
  1082.     or.b    d1,d0
  1083.     move.b    d0,(a2)+    *9)OP4:DT1/MUL
  1084. ************************************************
  1085.     move.b    $10(a1),d0
  1086.     andi.b    #127,d0
  1087.     move.b    d0,(a2)+    *10)OP1:TL
  1088.     move.b    $26(a1),d0
  1089.     andi.b    #127,d0
  1090.     move.b    d0,(a2)+    *11)OP3:TL
  1091.     move.b    $1b(a1),d0
  1092.     andi.b    #127,d0
  1093.     move.b    d0,(a2)+    *12)OP2:TL
  1094.     move.b    $31(a1),d0
  1095.     andi.b    #127,d0
  1096.     move.b    d0,(a2)+    *13)OP4:TL
  1097.  
  1098.     move.b    $11(a1),d0    *KS
  1099.     andi.b    #3,d0
  1100.     ror.b    #2,d0
  1101.     move.b    $0b(a1),d1    *AR
  1102.     andi.b    #31,d1
  1103.     or.b    d1,d0
  1104.     move.b    d0,(a2)+    *14)OP1:KS/AR
  1105.  
  1106.     move.b    $27(a1),d0    *KS
  1107.     andi.b    #3,d0
  1108.     ror.b    #2,d0
  1109.     move.b    $21(a1),d1    *AR
  1110.     andi.b    #31,d1
  1111.     or.b    d1,d0
  1112.     move.b    d0,(a2)+    *15)OP3:KS/AR
  1113.  
  1114.     move.b    $1c(a1),d0    *KS
  1115.     andi.b    #3,d0
  1116.     ror.b    #2,d0
  1117.     move.b    $16(a1),d1    *AR
  1118.     andi.b    #31,d1
  1119.     or.b    d1,d0
  1120.     move.b    d0,(a2)+    *16)OP2:KS/AR
  1121.  
  1122.     move.b    $32(a1),d0    *KS
  1123.     andi.b    #3,d0
  1124.     ror.b    #2,d0
  1125.     move.b    $2c(a1),d1    *AR
  1126.     andi.b    #31,d1
  1127.     or.b    d1,d0
  1128.     move.b    d0,(a2)+    *17)OP4:KS/AR
  1129. ************************************************
  1130.     move.b    $15(a1),d0    *AME
  1131.     andi.b    #1,d0
  1132.     ror.b    #1,d0
  1133.     move.b    $0c(a1),d1    *1DR
  1134.     andi.b    #31,d1
  1135.     or.b    d1,d0
  1136.     move.b    d0,(a2)+    *18)OP1:AME/1DR
  1137.  
  1138.     move.b    $2b(a1),d0    *AME
  1139.     andi.b    #1,d0
  1140.     ror.b    #1,d0
  1141.     move.b    $22(a1),d1    *1DR
  1142.     andi.b    #31,d1
  1143.     or.b    d1,d0
  1144.     move.b    d0,(a2)+    *19)OP3:AME/1DR
  1145.  
  1146.     move.b    $20(a1),d0    *AME
  1147.     andi.b    #1,d0
  1148.     ror.b    #1,d0
  1149.     move.b    $17(a1),d1    *1DR
  1150.     andi.b    #31,d1
  1151.     or.b    d1,d0
  1152.     move.b    d0,(a2)+    *20)OP2:AME/1DR
  1153.  
  1154.     move.b    $36(a1),d0    *AME
  1155.     andi.b    #1,d0
  1156.     ror.b    #1,d0
  1157.     move.b    $2d(a1),d1    *1DR
  1158.     andi.b    #31,d1
  1159.     or.b    d1,d0
  1160.     move.b    d0,(a2)+    *21)OP4:AME/1DR
  1161. ************************************************
  1162.     move.b    $14(a1),d0    *DT2
  1163.     andi.b    #3,d0
  1164.     ror.b    #2,d0
  1165.     move.b    $0d(a1),d1    *2DR
  1166.     andi.b    #31,d1
  1167.     or.b    d1,d0
  1168.     move.b    d0,(a2)+    *22)OP1:DT2/2DR
  1169.  
  1170.     move.b    $2a(a1),d0    *DT2
  1171.     andi.b    #3,d0
  1172.     ror.b    #2,d0
  1173.     move.b    $23(a1),d1    *2DR
  1174.     andi.b    #31,d1
  1175.     or.b    d1,d0
  1176.     move.b    d0,(a2)+    *23)OP3:DT2/2DR
  1177.  
  1178.     move.b    $1f(a1),d0    *DT2
  1179.     andi.b    #3,d0
  1180.     ror.b    #2,d0
  1181.     move.b    $18(a1),d1    *2DR
  1182.     andi.b    #31,d1
  1183.     or.b    d1,d0
  1184.     move.b    d0,(a2)+    *24)OP2:DT2/2DR
  1185.  
  1186.     move.b    $35(a1),d0    *DT2
  1187.     andi.b    #3,d0
  1188.     ror.b    #2,d0
  1189.     move.b    $2e(a1),d1    *2DR
  1190.     andi.b    #31,d1
  1191.     or.b    d1,d0
  1192.     move.b    d0,(a2)+    *25)OP4:DT2/2DR
  1193. ************************************************
  1194.     move.b    $0f(a1),d0    *1DL
  1195.     andi.b    #15,d0
  1196.     lsl.b    #4,d0
  1197.     move.b    $0e(a1),d1    *RR
  1198.     andi.b    #15,d1
  1199.     or.b    d1,d0
  1200.     move.b    d0,(a2)+    *26)OP1:D1L/RR
  1201.  
  1202.     move.b    $25(a1),d0    *1DL
  1203.     andi.b    #15,d0
  1204.     lsl.b    #4,d0
  1205.     move.b    $24(a1),d1    *RR
  1206.     andi.b    #15,d1
  1207.     or.b    d1,d0
  1208.     move.b    d0,(a2)+    *27)OP3:D1L/RR
  1209.  
  1210.     move.b    $1a(a1),d0    *1DL
  1211.     andi.b    #15,d0
  1212.     lsl.b    #4,d0
  1213.     move.b    $19(a1),d1    *RR
  1214.     andi.b    #15,d1
  1215.     or.b    d1,d0
  1216.     move.b    d0,(a2)+    *28)OP2:D1L/RR
  1217.  
  1218.     move.b    $30(a1),d0    *1DL
  1219.     andi.b    #15,d0
  1220.     lsl.b    #4,d0
  1221.     move.b    $2f(a1),d1    *RR
  1222.     andi.b    #15,d1
  1223.     or.b    d1,d0
  1224.     move.b    d0,(a2)+    *29)OP4:D1L/RR
  1225. ************************************************
  1226.     lea    55(a1),a1
  1227.     moveq.l    #fmsndname_len-1,d0    *音色名の最大長
  1228. @@:                *音色名転送
  1229.     move.b    (a1)+,(a2)+
  1230.     dbeq    d0,@b
  1231.     t_dat_ok
  1232.  
  1233. m_vset_zmd:                *ZMD形式
  1234.     moveq.l    #fmsnd_size-2-1,d0
  1235. @@:
  1236.     move.b    (a1)+,(a2)+
  1237.     dbra    d0,@b
  1238.     t_dat_ok
  1239.  
  1240. m_vset2:                *AL/FB分離方式
  1241.     * < d1.l=offset
  1242.     * < a2.l=fmsnd_buffer
  1243.     move.l    a1,a0            *保存
  1244.     move.l    a2,a3            *use later
  1245.     addq.w    #6,a2            *op_paramを収納
  1246.     lea    -11(a1),a1        *-11はつじつま合わせ
  1247.     bsr    op_param
  1248.  
  1249.     move.b    50(a0),(a3)+        *0)LFRQ
  1250.  
  1251.     move.b    51(a0),d0        *1)PMD
  1252.     tas.b    d0
  1253.     move.b    d0,(a3)+
  1254.  
  1255.     move.b    52(a0),d0        *2)AMD
  1256.     andi.b    #127,d0
  1257.     move.b    d0,(a3)+
  1258.                     *3)SYNC/OM/WF
  1259.     move.b    46(a0),d0        *OM
  1260.     andi.b    #$0f,d0
  1261.     lsl.b    #3,d0
  1262.     tst.b    49(a0)            *SYNC
  1263.     beq    @f
  1264.     tas.b    d0
  1265. @@:
  1266.     move.b    48(a0),d1        *WF
  1267.     andi.b    #3,d1
  1268.     or.b    d1,d0
  1269.     move.b    d0,(a3)+
  1270.  
  1271.     move.b    47(a0),d0        *PAN
  1272.     andi.b    #3,d0
  1273.     ror.b    #2,d0
  1274.     move.b    45(a0),d1        *FB
  1275.     andi.b    #7,d1
  1276.     lsl.b    #3,d1
  1277.     or.b    d1,d0
  1278.     move.b    44(a0),d1        *AL
  1279.     andi.b    #7,d1
  1280.     or.b    d1,d0
  1281.     move.b    d0,(a3)+        *4)PAN/AF
  1282.  
  1283.     move.b    53(a0),d0        *PMS
  1284.     andi.b    #7,d0
  1285.     lsl.b    #4,d0
  1286.     move.b    54(a0),d1        *AMS
  1287.     andi.b    #3,d1
  1288.     or.b    d1,d0
  1289.     move.b    d0,(a3)+        *5)
  1290.     t_dat_ok
  1291.  
  1292. spread_fmsnd_n:                *波形メモリ管理テーブル
  1293. reglist    reg    d0-d4/a0-a1
  1294.     * < d1.w=0-65534
  1295.     * - all
  1296.     movem.l    reglist,-(sp)
  1297.     andi.l    #$ffff,d1
  1298.     addq.l    #8,d1            *上限を増やす
  1299.     cmpi.l    #fmsnd_reg_max,d1
  1300.     bls    @f
  1301.     move.l    #fmsnd_reg_max,d1
  1302. @@:
  1303.     move.l    d1,d4            *new n-max
  1304.     lsl.w    #4,d1
  1305.     move.l    d1,d2
  1306.     add.w    d1,d1
  1307.     add.w    d1,d2            *fmsnd_size倍
  1308.     move.l    fmsnd_buffer-work(a6),d0    *enlarge or get?
  1309.     bne    enlrg_fmtb
  1310.     move.l    #ID_FMSND,d3        *ID
  1311.     jbsr    get_mem
  1312.     tst.l    d0
  1313.     bmi    err_exit_spfmt
  1314.     move.l    a0,fmsnd_buffer-work(a6)
  1315.     move.w    d4,fmsnd_n_max-work(a6)
  1316.     jsr    fmsnd_init-work(a6)
  1317.     moveq.l    #0,d0            *no error
  1318.     movem.l    (sp)+,reglist
  1319.     rts
  1320. enlrg_fmtb:
  1321.     moveq.l    #0,d3
  1322.     move.w    fmsnd_n_max-work(a6),d3
  1323.     move.l    d0,a1            *addr
  1324.     jbsr    enlarge_mem
  1325.     tst.l    d0
  1326.     bmi    err_exit_spfmt
  1327.     move.l    a0,fmsnd_buffer-work(a6)
  1328.     move.w    d4,fmsnd_n_max-work(a6)
  1329.     sub.w    d3,d4
  1330.     lsl.w    #4,d3
  1331.     move.w    d3,d1
  1332.     add.w    d1,d1
  1333.     add.w    d1,d3            *fmsnd_size倍
  1334.     add.w    d3,a0
  1335.     subq.w    #1,d4            *for dbra
  1336. @@:
  1337.     clr.w    (a0)
  1338.     lea    fmsnd_size(a0),a0
  1339.     dbra    d4,@b
  1340.     moveq.l    #0,d0
  1341.     movem.l    (sp)+,reglist
  1342.     rts
  1343. err_exit_spfmt:                *メモリ不足エラー
  1344.     moveq.l    #-1,d0
  1345.     movem.l    (sp)+,reglist
  1346.     rts
  1347.  
  1348. m_tempo:            *テンポセット    !v3
  1349.     *   cmd=$06
  1350.     * < d1.lw=tempo value(Timer A:77~32767,Timer B:20~5000,YM3802:1~32767
  1351.     *              -1:で現在のテンポ取得)
  1352.     * < d1.hw=設定モード(-1:でZMUSICのワークに反映しない,0:反映する)
  1353.     * > d0.hw=timer value
  1354.     * > d0.lw=tempo value
  1355.     ori.w    #$0700,sr
  1356.     move.l    tempo_value-work(a6),d7
  1357.     cmpi.w    #-1,d1
  1358.     bne    @f
  1359.     move.l    d7,d0        *取得のみ
  1360.     swap    d0
  1361.     rts
  1362. @@:
  1363.     move.l    d1,d6
  1364.     tempo_range    d6
  1365.     move.w    d6,tempo_value-work(a6)
  1366.     jsr    calc_timer-work(a6)
  1367.     jsr    _init_timer-work(a6)
  1368.     tst.l    d6
  1369.     bpl    @f
  1370.     move.l    d7,tempo_value-work(a6)    *反映しないモードならば以前の値に戻す
  1371. @@:
  1372.     move.l    d7,d0
  1373.     swap    d0
  1374. m_tempo_patch:            *nmdb!!(MIDI I/Fが無い時rts)
  1375.                 *タイミングクロック自動送出設定
  1376. midi_clk:            *タイミングクロック値セット
  1377.     * - d0,a0
  1378.     * x d1,d2
  1379.     move.w    sr,-(sp)
  1380.     ori.w    #$0700,sr
  1381.     move.l    a0,-(sp)
  1382.     move.w    timer_value-work(a6),d1
  1383.  
  1384.     lea    rgr,a0
  1385.     move.b    #8,(a0)
  1386.                 midiwait
  1387.     ori.w    #$8000,d1
  1388.     move.w    d1,d2
  1389.     move.b    d1,grp6-rgr(a0)
  1390.                 midiwait
  1391.     ror.w    #8,d1
  1392.     move.b    d1,grp7-rgr(a0)
  1393.                 midiwait
  1394. midi_clk2:            *nmdb2!!
  1395.     add.w    #$10,a0        *2枚目のCZ6BM1用
  1396.     move.b    #8,(a0)
  1397.                 midiwait
  1398.     move.b    d2,grp6-rgr(a0)
  1399.                 midiwait
  1400.     ror.w    #8,d2
  1401.     move.b    d2,grp7-rgr(a0)
  1402.                 midiwait
  1403. midi_clk2_e:
  1404.     move.l    (sp)+,a0
  1405.     move.w    (sp)+,sr
  1406.     rts
  1407.  
  1408. set_timer_value:        *タイマーの値を設定する
  1409.     *   cmd=$07
  1410.     * < d1.lw=timer value(Timer A:0~1023,Timer B:0~255,YM3802:0~8191)
  1411.     *              -1:で現在のタイマ値取得)
  1412.     * < d1.hw=設定モード(-1:でZMUSICのワークに反映しない,0:反映する)
  1413.     * > d0.hw=tempo value
  1414.     * > d0.lw=timer value
  1415.     ori.w    #$0700,sr
  1416.     lea    tempo_value-work(a6),a1
  1417.     move.l    (a1)+,d7
  1418.     cmpi.w    #-1,d1        *取得
  1419.     beq    @f
  1420.     move.l    d1,d6
  1421.     move.w    d1,-2(a1)
  1422. set_timer_value_patch:        *使用タイマーによって変わる
  1423.     jsr    gyakusan_tm_m-work(a6)    *< a1.l=timer_value+2 >a1.l=tempo_value 
  1424.     jsr    _init_timer-work(a6)
  1425.     tst.l    d6        *反映しないモードならば以前の値に戻す
  1426.     bpl    @f
  1427.     move.l    d7,(a1)
  1428. @@:
  1429.     move.l    d7,d0
  1430.     rts
  1431.  
  1432. m_play:                *演奏開始    !v3
  1433.     *    cmd=$08
  1434.     * < a1.l=track numbers{tr.w,tr.w,...-1(.w)}
  1435.     *    =0 to play all(戻り値無し)
  1436.     * > (a0)    設定できなかったトラック番号の並びが返る
  1437.     *        -1=end code
  1438.     * > a1.l=next addr
  1439.     move.l    m_play_result-work(a6),a0
  1440.     move.w    #-1,(a0)
  1441.     move.l    a1,d0
  1442.     seq    play_bak_flg-work(a6)    *全トラック演奏か否か
  1443.     beq    m_play_all
  1444. m_play_again_entry:
  1445.     ori.w    #$700,sr
  1446.     move.l    a1,a2
  1447.     move.l    play_bak-work(a6),a3
  1448. @@:
  1449.     move.w    (a2)+,d0
  1450.     move.w    d0,(a3)+
  1451.     cmpi.w    #-1,d0
  1452.     bne    @b
  1453.     move.w    #-1,(a3)
  1454. m_play_lp:
  1455.     move.w    (a1)+,d1
  1456.     cmpi.w    #-1,d1
  1457.     beq    mpa_end            *routine exit
  1458.     move.l    play_trk_tbl-work(a6),a3
  1459. @@:
  1460.     moveq.l    #0,d0
  1461.     move.w    (a3)+,d0
  1462.     cmpi.w    #-1,d0
  1463.     beq    m_play_err
  1464.     cmp.w    d0,d1
  1465.     bne    @b
  1466.     jsr    top_ptr_set-work(a6)        *>a5=seq_wk_tbl n
  1467.     bra    m_play_lp
  1468. m_play_err:
  1469.     move.w    d1,(a0)+
  1470.     move.w    #-1,(a0)
  1471.     bra    m_play_lp
  1472.  
  1473. m_play_all:            *演奏可能なチャンネルを全部演奏
  1474.     jsr    stop_timer-work(a6)
  1475.     bsr    all_key_off2    *all key off
  1476.  
  1477.     move.l    play_trk_tbl-work(a6),a3
  1478. mpa_lp:
  1479.     moveq.l    #0,d0
  1480.     move.w    (a3)+,d0    *0-127
  1481.     cmpi.w    #-1,d0
  1482.     beq    mpa_end
  1483.     jsr    top_ptr_set-work(a6)    *>a5=seq_wk_tbl n
  1484.     bra    mpa_lp
  1485. mpa_end:
  1486.     move.l    m_play_result-work(a6),a0    *戻り値
  1487. m_play00:                    *FUNC INTERCEPT_PLAY で書き変わる
  1488.     bset.b    #pf_PLAY,perform_flg-work(a6)
  1489.     move.l    obtevtjtbl-work+mp_jump(a6),d0
  1490.     beq    @f
  1491.     move.l    d0,a4
  1492.     jsr    (a4)
  1493. @@:
  1494.     ori.w    #$0700,sr
  1495.     clr.l    zmusic_int-work(a6)
  1496.     jsr    init_timer-work(a6)
  1497.     bsr    get_present_time        *> d1.l=00HHMMSS
  1498.     move.l    d1,play_start_time-work(a6)
  1499.     move.l    #-1,play_stop_time-work(a6)
  1500.     move.l    #-1,play_cont_time-work(a6)
  1501. m_play_patch:                *nmdb!!(patched to be RTS)
  1502.     clr.b    start_wait_flg-work(a6)    *$FA待ち(外部シーケンサホストモードの時意味をなす)
  1503.     bsr    midi_clk
  1504.     lea    rgr+6,a4        *=grp4
  1505.     move.b    #1,-6(a4)
  1506.                     midiwait
  1507. mpp_fa0:                *外部シーケンサがホストの時はbra _mpp_fa0
  1508.     move.b    #%1111_1010,2(a4)    *midi start!($fa)
  1509.                     midiwait
  1510. _mpp_fa0:
  1511.     move.b    f8_start-work(a6),(a4)    *trans $f8 start
  1512.                     midiwait
  1513. _mpp:                    *nmdb2!!(patched to be RTS)
  1514.     add.w    #$10,a4            *2枚目のCZ6BM1用
  1515.     move.b    #1,-6(a4)
  1516.                     midiwait
  1517. mpp_fa1:                *外部シーケンサがホストの時はbra _mpp_fa1
  1518.     move.b    #%1111_1010,2(a4)    *midi start!($fa)
  1519.                     midiwait
  1520. _mpp_fa1:
  1521.     move.b    f8_start-work(a6),(a4)    *trans $f8 start
  1522.                     midiwait
  1523.     rts
  1524.  
  1525. m_play_again:                *前回のm_play()をもう一度やる    !v3
  1526.     *   cmd=$0a
  1527.     move.l    m_play_result-work(a6),a0
  1528.     tst.b    play_bak_flg-work(a6)
  1529.     bne    m_play_all        *全トラック演奏のケース
  1530.     move.l    play_bak-work(a6),a1
  1531.     bra    m_play_again_entry    *指定トラック演奏のケース
  1532.  
  1533. do_init_wks    macro    param        *デバイスの種類に依存しない初期化群
  1534.     *アフタータッチ関係
  1535.     move.l    #$00_00_80_ff,p_aftc_omt(a5)    *p_aftc_omt,p_aftc_rltv,p_aftc_flg,p_aftc_level
  1536.     move.l    d0,p_aftc_sw(a5)        *p_aftc_sw,p_aftc_sw2,p_aftc_1st_dly
  1537.     move.l    #$0001_0001,p_aftc_syncnt(a5)    *p_aftc_syncnt,p_aftc_syncnt2
  1538.  
  1539.     *PMOD関係
  1540.     init_pmod_wk    0,d0,a5
  1541.  
  1542.     *ARCC関係
  1543.     lea    p_arcc_param(a5),a4
  1544.     moveq.l    #arcc_max-1,d1
  1545. @@:
  1546.     init_arcc_wk    param,$80
  1547.     add.w    #__arcc_len,a4
  1548.     dbra    d1,@b
  1549.  
  1550.     *ベロシティ・シーケンス関係
  1551.     lea    p_vseq_param(a5),a4
  1552.     init_arcc_wk    0,0
  1553.  
  1554.     *ベンド関係
  1555.     move.l    d0,p_detune(a5)        *p_detune,p_special_tie
  1556.     move.l    d0,p_port_dly(a5)    *p_port_dly,p_port_tail
  1557.     move.l    d0,p_bend_dly(a5)    *p_bend_dly,p_bend_tail
  1558.     move.l    d0,p_port2_dly(a5)    *p_port2_dly,p_port_tail
  1559.     move.l    d0,p_port_pitch(a5)
  1560.     move.l    d0,p_port_flg(a5)    *p_port_flg,p_port2_flg,p_bend_sw,p_agogik_flg
  1561.     move.w    d0,p_bend_dst(a5)
  1562.  
  1563.     lea    p_measure(a5),a4    *一般ワーク関係
  1564.     move.l    d0,(a4)+        *p_measure
  1565.     move.l    d0,(a4)+        *p_voice_rsv,p_next_on,p_tone_set
  1566.     move.l    d0,(a4)+        *p_return
  1567.     move.l    mask_preserve-work(a6),d0    *マスクを保存?
  1568.     and.l    d0,(a4)+        *p_transpose,p_mask_mode,p_damper,p_seq_flag
  1569.     move.l    #$ffff_0000,(a4)+    *p_bank_msb,p_bank_lsb,p_pgm
  1570.     move.l    #$01_0c_ff_ff,(a4)+    *p_sync_wk,p_@b_range,p_vol16,p_velo16
  1571.     move.l    #$0000_ffff,(a4)+    *p_do_loop_flag,p_md_flg,p_how_many,p_last_note
  1572.     move.l    #$41_10_42_ff,(a4)+    *p_maker,p_device,p_module,p_effect1
  1573.     move.l    #$ffffffff,(a4)+    *p_effect3,p_effect4,p_effect2,p_effect5
  1574.  
  1575.     endm
  1576.  
  1577. init_wks:                *ここではレジスタを壊してはいけない(except d0,d1)
  1578.     * < d4.l=p_type,ch
  1579.     * X d0,d1,a4
  1580.     * - d4
  1581.     move.w    #$0001,(a5)            *p_step_time
  1582. init_wks2:
  1583.     tst.l    d4
  1584.     bmi    init_wks_md
  1585.     btst.l    #16,d4
  1586.     beq    init_wks_fm
  1587.  
  1588. init_wks_ad:                *ADPCM
  1589.     * < d4.l=p_type,ch
  1590.     * X d0,d1,a4
  1591.     * - d4
  1592.     moveq.l    #0,d0
  1593.     do_init_wks    7        *volume
  1594.     move.l    #$40_40_04_40,p_vol(a5)    *一度に複数を初期化(p_vol,p_velo,p_frq,p_pan)
  1595.     lea    ad_vol_tbl-work(a6),a4
  1596.     move.b    #$40,(a4,d4.w)
  1597. iw_ad0:
  1598.     lea    p_note(a5),a4
  1599.     move.l    #$ffff_0010,d0
  1600. @@:
  1601.     move.l    d0,(a4)+
  1602.     dbra    d0,@b
  1603.     rts
  1604.  
  1605. init_wks_fm:                *FM
  1606.     * < d4.l=p_type,ch
  1607.     * X d0,d1,a4
  1608.     * - d4
  1609.     moveq.l    #0,d0
  1610.     do_init_wks    0
  1611.     move.l    #$6a_6a_04_40,p_vol(a5)    *一度に複数を初期化(p_vol,p_velo,p_frq,p_pan)
  1612.     lea    fm_vol_tbl-work(a6),a4
  1613.     move.b    #$6a,(a4,d4.w)
  1614. iw_fm0:
  1615.     lea    p_note(a5),a4
  1616.     move.l    #$ffff_0010-1,d0
  1617. @@:
  1618.     move.l    d0,(a4)+
  1619.     dbra    d0,@b
  1620.     lea    fm_tone_set-work(a6),a4
  1621.     move.w    d4,d1
  1622.     add.w    d1,d1
  1623.     move.w    d0,(a4,d1.w)        *-1
  1624.     rts
  1625.  
  1626. init_wks_md:                *MIDI
  1627.     * < d4.l=p_type,ch
  1628.     * X d0,d1,a4
  1629.     * - d4
  1630.     moveq.l    #0,d0
  1631.     do_init_wks    11        *expression
  1632.     move.l    #$40_7f_04_40,p_vol(a5)    *一度に複数を初期化(p_vol,p_velo,p_frq,p_pan)
  1633.     move.l    d4,d0
  1634.     swap    d0
  1635.     lsl.w    #4,d0            *16倍
  1636.     lea    m0_vol_tbl-work(a6),a4
  1637.     add.w    d0,a4
  1638.     move.b    #$40,(a4,d4.w)
  1639. iw_md0:
  1640.     lea    p_note(a5),a4
  1641.     move.l    #$ffff_0010,d0
  1642. @@:
  1643.     move.l    d0,(a4)+
  1644.     dbra    d0,@b
  1645.     rts
  1646.  
  1647. m_play_status:                *演奏状態の検査
  1648.     *   cmd=$0b
  1649.     * < d1.l=0:check all ch mode
  1650.     * < a1.l=result status table address
  1651.     *        (a1.l=0とすると戻り値はテーブルで返らずにd0.lに返る)
  1652.     * > (a1)={active_device.l,active_device.l,...,-1.l }
  1653.     * > d0.l=(a1.l=0のときのみ。0:演奏終了,1:演奏中)
  1654.     *
  1655.     * < d1.l=1:check all track mode
  1656.     * < a1.l=result status table address
  1657.     *        (a1.l=0とすると戻り値はテーブルで返らずにd0.lに返る)
  1658.     * > (a1)={active_track.w,active_track.w,...,-1.w}
  1659.     * > d0.l=(a1.l=0のときのみ。0:演奏終了,1:演奏中)
  1660.     *
  1661.     * < d1.l=2:channel checking mode
  1662.     * < d2.hw=p_type($0000:FM,$0001:ADPCM,$8000~$8002:MIDI1~3)
  1663.     * < d2.lw=p_ch(0-15)
  1664.     * > d0.b=0 non active
  1665.     *     ne    active
  1666.     *
  1667.     * < d1.l=3:track checking mode
  1668.     * < d2.l=track number(0-65534)
  1669.     * > d0.b=0 non active
  1670.     *     ne    active
  1671.     add.w    d1,d1
  1672.     move.w    @f(pc,d1.w),d1
  1673.     jmp    @f(pc,d1.w)
  1674. @@:
  1675.     dc.w    m_stat_all_ch-@b
  1676.     dc.w    m_stat_all_tr-@b
  1677.     dc.w    m_stat_ch-@b
  1678.     dc.w    m_stat_tr-@b
  1679.  
  1680. m_stat_ch:                *チャンネルの検査
  1681.     move.l    play_trk_tbl-work(a6),a0
  1682. @@:
  1683.     moveq.l    #0,d0
  1684.     move.w    (a0)+,d0
  1685.     cmpi.w    #-1,d0
  1686.     beq    @f
  1687.     calc_wk    d0
  1688.     cmp.l    p_type(a5),d2        *検査チャンネルか
  1689.     bne    @b
  1690.     tst.b    p_track_stat(a5)    *チャンネルが生きているか
  1691.     bne    @b            *1つでも生きていたら生きていたことになる
  1692.     moveq.l    #-1,d0            *active
  1693.     rts
  1694. @@:
  1695.     moveq.l    #0,d0            *dead
  1696.     rts
  1697.  
  1698. m_stat_tr:                *トラックの検査
  1699.     move.l    play_trk_tbl-work(a6),a0
  1700. @@:
  1701.     moveq.l    #0,d0
  1702.     move.w    (a0)+,d0
  1703.     cmpi.w    #-1,d0
  1704.     beq    @f
  1705.     cmp.w    d0,d2            *検査トラックか
  1706.     bne    @b
  1707.     calc_wk    d0
  1708.     tst.b    p_track_stat(a5)    *チャンネルが生きているか
  1709.     bne    @f
  1710.     moveq.l    #-1,d0            *active
  1711.     rts
  1712. @@:
  1713.     moveq.l    #0,d0            *dead
  1714.     rts
  1715.  
  1716. m_stat_all_ch:                *全チャンネルの検査
  1717.     move.l    a1,d0
  1718.     beq    m_stat_all
  1719.     move.l    #-1,(a1)
  1720.     move.l    a1,a2
  1721.     move.l    play_trk_tbl-work(a6),a0
  1722. mstlp:
  1723.     moveq.l    #0,d0
  1724.     move.w    (a0)+,d0
  1725.     cmpi.w    #-1,d0
  1726.     beq    mst_exit
  1727.     calc_wk    d0
  1728.     tst.b    p_track_stat(a5)
  1729.     bne    mstlp
  1730.     move.l    p_type(a5),d0
  1731.     move.l    d0,(a2)+        *sentinel
  1732.     move.l    #-1,(a2)
  1733.     move.l    a1,a3
  1734. @@:
  1735.     cmp.l    (a3)+,d0
  1736.     bne    @b
  1737.     cmpa.l    a3,a2
  1738.     beq    mstlp
  1739.     move.l    #-1,-(a2)    *kill sentinel
  1740.     bra    mstlp
  1741. mst_exit:
  1742.     rts
  1743.  
  1744. m_stat_all_tr:                *全トラックの検査
  1745.     move.l    a1,d0
  1746.     beq    m_stat_all
  1747.     move.w    #-1,(a1)
  1748.     move.l    a1,a2
  1749.     move.l    play_trk_tbl-work(a6),a0
  1750. @@:
  1751.     moveq.l    #0,d0
  1752.     move.w    (a0)+,d0
  1753.     cmpi.w    #-1,d0
  1754.     beq    @f
  1755.     move.l    d0,d1
  1756.     calc_wk    d1
  1757.     tst.b    p_track_stat(a5)
  1758.     bne    @b
  1759.     move.w    d0,(a2)+
  1760.     move.w    #-1,(a2)
  1761.     bra    @b
  1762. @@:
  1763.     rts
  1764.  
  1765. m_stat_all:
  1766.     move.l    play_trk_tbl-work(a6),a0
  1767. @@:
  1768.     moveq.l    #0,d0
  1769.     move.w    (a0)+,d0
  1770.     cmpi.w    #-1,d0
  1771.     beq    @f
  1772.     move.l    d0,d1
  1773.     calc_wk    d1
  1774.     tst.b    p_track_stat(a5)
  1775.     bne    @b
  1776.     moveq.l    #-1,d0        *演奏中
  1777.     rts
  1778. @@:
  1779.     moveq.l    #0,d0        *演奏終了
  1780.     rts
  1781.  
  1782. m_stop:                *演奏停止
  1783.     *   cmd=$0c
  1784.     * < a1.l=track numbers{tr.w,tr.w,...-1(.w)}
  1785.     * <     =0 to stop all
  1786.     * > (a0)    設定できなかったトラック番号の並び
  1787.     *        -1=end code
  1788.     * > a1.l=next addr
  1789.     move.l    m_stop_result-work(a6),a0
  1790.     move.w    #-1,(a0)
  1791.     move.l    a1,d0
  1792.     beq    m_stop_all
  1793. m_stop_lp:
  1794.     move.w    (a1)+,d1
  1795.     cmpi.w    #-1,d1
  1796.     beq    msa_end                *routine exit
  1797.     move.l    play_trk_tbl-work(a6),a3
  1798. @@:
  1799.     moveq.l    #0,d0
  1800.     move.w    (a3)+,d0
  1801.     cmpi.w    #-1,d0
  1802.     beq    m_stop_err
  1803.     cmp.w    d0,d1
  1804.     bne    @b
  1805.     calc_wk    d0
  1806.     bset.b    #_ID_PLAY_STOP,p_track_stat(a5)    *演奏状態から停止状態へ
  1807.     bne    m_stop_lp            *もともと演奏停止してた
  1808.     move.l    p_type(a5),d4
  1809.     bsr    _ms_key_off
  1810.     bra    m_stop_lp
  1811. m_stop_err:
  1812.     move.w    d1,(a0)+
  1813.     move.w    #-1,(a0)
  1814.     bra    m_stop_lp
  1815.  
  1816. m_stop_all:            *演奏中の全トラックを停止
  1817.     jbsr    stop_smf    *SMFが送信中ならそれを停止
  1818.     jsr    stop_timer-work(a6)
  1819. *    bsr    all_key_off    *all key off
  1820.  
  1821.     move.l    play_trk_tbl-work(a6),a3
  1822. msa_lp:
  1823.     moveq.l    #0,d0
  1824.     move.w    (a3)+,d0
  1825.     cmpi.w    #-1,d0
  1826.     beq    msa_end
  1827.     calc_wk    d0
  1828.     bset.b    #_ID_PLAY_STOP,p_track_stat(a5)    *演奏状態から停止状態へ
  1829.     bne    msa_lp                *元もと演奏は停止していた
  1830.     move.l    p_type(a5),d4
  1831.     bsr    _ms_key_off
  1832.     bra    msa_lp
  1833. msa_end:
  1834.     bset.b    #pf_STOP,perform_flg-work(a6)
  1835.     move.l    obtevtjtbl-work+ms_jump(a6),d0
  1836.     beq    @f
  1837.     move.l    d0,a0
  1838.     jsr    (a0)
  1839. @@:
  1840.     move.l    m_stop_result-work(a6),a0    *戻り値
  1841.     bsr    get_present_time        *> d1.l=00HHMMSS
  1842.     move.l    d1,play_stop_time-work(a6)
  1843.     move.l    #-1,play_cont_time-work(a6)
  1844. m_stop_patch:                *nmdb!!(patched to be RTS)
  1845.     lea    rgr+6,a4        *=grp4
  1846.     ori.w    #$0700,sr
  1847.     move.b    #1,-6(a4)
  1848.                     midiwait
  1849.     move.b    #%1111_1100,2(a4)    *midi stop($fc)
  1850.                     midiwait
  1851.     move.b    f8_stop-work(a6),(a4)    *trans $f8 stop
  1852.                     midiwait
  1853. _msp:                    *nmdb2!!(patched to be RTS)
  1854.     add.w    #$10,a4            *2枚目のCZ6BM1用
  1855.     move.b    #1,-6(a4)
  1856.                     midiwait
  1857.     move.b    #%1111_1100,2(a4)    *midi stop($fc)
  1858.                     midiwait
  1859.     move.b    f8_stop-work(a6),(a4)    *trans $f8 stop
  1860.                     midiwait
  1861.     rts
  1862.  
  1863. ms_key_off:                *キーオフする
  1864.     tst.l    d4
  1865. _ms_key_off:
  1866.     bmi    ms_key_off_md
  1867.     btst.l    #16,d4
  1868.     bne    ms_key_off_ad
  1869.  
  1870. ms_key_off_fm:                *強制的にFMをキーオフする
  1871.     * - a4(一部のルーチンでは保存される必要があるため)
  1872.     jmp    do_kn_fm-work(a6)
  1873.  
  1874. ms_key_off_ad:                *強制的にADPCMをキーオフする
  1875.     jmp    do_kn_ad-work(a6)
  1876.  
  1877. ms_key_off_md:                *強制的にMIDIをキーオフする
  1878. reglist    reg    a2/a4
  1879.     movem.l    reglist,-(sp)
  1880.     tst.b    p_damper(a5)
  1881.     beq    @f
  1882.     move.l    p_midi_trans(a5),a2
  1883.     moveq.l    #$b0,d0
  1884.     or.b    d4,d0        *ダンパーを一時的にオフする動作
  1885.     jsr    (a2)
  1886.     moveq.l    #64,d0
  1887.     jsr    (a2)
  1888.     moveq.l    #0,d0
  1889.     jsr    (a2)
  1890.     jsr    do_kn_md-work(a6)
  1891.     moveq.l    #$b0,d0
  1892.     or.b    d4,d0        *ダンパーをもとに戻す動作
  1893.     jsr    (a2)
  1894.     moveq.l    #64,d0
  1895.     jsr    (a2)
  1896.     moveq.l    #127,d0
  1897.     jsr    (a2)
  1898.     movem.l    (sp)+,reglist
  1899.     rts
  1900. @@:
  1901.     jsr    do_kn_md-work(a6)
  1902.     movem.l    (sp)+,reglist
  1903.     rts
  1904.  
  1905. m_cont:                *演奏再開
  1906.     *   cmd=$0d
  1907.     * < a1.l=track numbers{tr.w,tr.w,...-1(.w)}
  1908.     *    =0 to continue all
  1909.     * > (a0)    設定できなかったトラック番号の並び
  1910.     *        -1=end code
  1911.     * > a1.l=next addr
  1912.     move.l    m_cont_result-work(a6),a0
  1913.     move.w    #-1,(a0)
  1914.     move.l    a1,d0
  1915.     beq    m_cont_all
  1916.     ori.w    #$700,sr
  1917. m_cont_lp:
  1918.     move.w    (a1)+,d1
  1919.     cmpi.w    #-1,d1
  1920.     beq    mca_end        *routine exit
  1921.     move.l    play_trk_tbl-work(a6),a3
  1922. @@:
  1923.     moveq.l    #0,d0
  1924.     move.w    (a3)+,d0        *active ?
  1925.     cmpi.w    #-1,d0
  1926.     beq    m_cont_err
  1927.     cmp.w    d0,d1
  1928.     bne    @b
  1929.     calc_wk    d0
  1930.     bclr.b    #_ID_PLAY_STOP,p_track_stat(a5)        *on
  1931.     beq    m_cont_lp        *もともと再生中
  1932.     move.w    p_type(a5),d0
  1933.     bne    m_cont_lp
  1934.     move.w    p_ch(a5),d4        *FMの時は音色復元処理が必要
  1935.     jsr    restore_opm-work(a6)
  1936.     bra    m_cont_lp
  1937. m_cont_err:
  1938.     move.w    d1,(a0)+
  1939.     move.w    #-1,(a0)
  1940.     bra    m_cont_lp
  1941.  
  1942. m_cont_all:                *全チャンネル再開
  1943.     ori.w    #$0700,sr
  1944.     move.l    play_trk_tbl-work(a6),a3
  1945. mca_lp:
  1946.     moveq.l    #0,d0
  1947.     move.w    (a3)+,d0
  1948.     cmpi.w    #-1,d0
  1949.     beq    mca_end
  1950.     calc_wk    d0
  1951.     bclr.b    #_ID_PLAY_STOP,p_track_stat(a5)
  1952.     beq    mca_lp
  1953.     move.w    p_type(a5),d0
  1954.     bne    mca_lp
  1955.     move.w    p_ch(a5),d4        *FMの時は音色復元処理が必要
  1956.     jsr    restore_opm-work(a6)
  1957.     bra    mca_lp
  1958. mca_end:
  1959.     bset.b    #pf_CONT,perform_flg-work(a6)
  1960.     move.l    obtevtjtbl-work+mc_jump(a6),d0
  1961.     beq    @f
  1962.     move.l    d0,a0
  1963.     jsr    (a0)
  1964. @@:
  1965.     move.l    m_cont_result-work(a6),a0    *戻り値
  1966. *    ori.w    #$0700,sr
  1967.     jsr    init_timer-work(a6)
  1968.     bsr    get_present_time    *> d1.l=00HHMMSS
  1969.     move.l    d1,play_cont_time-work(a6)
  1970. m_cont_patch:                *nmdb!!(patched to be RTS)
  1971.     bsr    midi_clk
  1972.     lea    rgr+6,a4        *=grp4
  1973.     move.b    #1,-6(a4)
  1974.                     midiwait
  1975.     move.b    #%1111_1011,2(a4)    *midi continue($fb)
  1976.                     midiwait
  1977.     move.b    f8_start-work(a6),(a4)    *trans $f8 start
  1978.                     midiwait
  1979. _mcp:                    *nmdb2!!(patched to be RTS)
  1980.     add.w    #$10,a4            *2枚目のCZ6BM1用
  1981.     move.b    #1,-6(a4)
  1982.                     midiwait
  1983.     move.b    #%1111_1011,2(a4)    *midi continue($fb)
  1984.                     midiwait
  1985.     move.b    f8_start-work(a6),(a4)    *trans $f8 start
  1986.                     midiwait
  1987.     rts
  1988.  
  1989. m_atoi:                *トラックデータアドレスを返す
  1990.     *   cmd=$0e
  1991.     * < d1.l=track number(0-65534)
  1992.     * > a0.l=track address(0:track doesn't exist)
  1993.     cmpi.l    #tr_max-1,d1
  1994.     bhi    t_illegal_track_number    *illegal trk number
  1995.     cmp.w    trk_n_max-work(a6),d1
  1996.     bcc    t_illegal_track_number        *illegal trk number
  1997.     move.l    trk_po_tbl-work(a6),d0
  1998.     beq    t_no_performance_data    *演奏データがない
  1999.     move.l    d0,a0
  2000.     lsl.l    #trk_tbl_size_,d1
  2001.     lea    ti_play_data(a0,d1.l),a0
  2002.     add.l    (a0)+,a0
  2003.     rts
  2004.  
  2005. wave_tbl_init:            *wave_tblの初期化
  2006.     * - all
  2007.     movem.l    d0-d1/a0-a1,-(sp)
  2008.     move.w    wave_n_max-work(a6),d0
  2009.     beq    exit_wti
  2010.     subq.w    #1,d0        *for dbra
  2011.     movea.l    wave_tbl-work(a6),a0
  2012. @@:
  2013.     bsr    do_init_wvtbl
  2014.     dbra    d0,@b
  2015. exit_wti:
  2016.     movem.l    (sp)+,d0-d1/a0-a1
  2017.     rts
  2018.  
  2019. do_init_wvtbl:
  2020.     * < a0.l=to be initialized
  2021.     * > a0.l=next
  2022.     * x a1
  2023.     lea    wv_dmy(pc),a1
  2024.     move.l    a1,(a0)+    *start address
  2025.     addq.w    #2,a1
  2026.     move.l    a1,(a0)+    *end address
  2027.     subq.w    #2,a1
  2028.     move.w    #$00ff,(a0)+    *loop mode
  2029.     move.l    a1,(a0)+    *loop start point
  2030.     addq.w    #4,a1
  2031.     move.l    a1,(a0)+    *loop end point
  2032.     clr.l    (a0)+        *loop time
  2033.     clr.l    (a0)+        *dummy
  2034.     clr.w    (a0)+        *name len
  2035.     clr.l    (a0)+        *name addr
  2036.     rts
  2037.  
  2038. wv_dmy:    dc.l    0
  2039.  
  2040. adpcm_tbl_init:                    *adpcm_tblの初期化
  2041.     * - all
  2042.     bsr    init_adpcm_tbl
  2043.     bra    init_adpcm_tbl2
  2044.  
  2045. init_midibd:                *MIDIボードのイニシャライズ
  2046.                     *nmdb!!
  2047.     move.w    sr,-(sp)
  2048.     ori.w    #$700,sr
  2049.     movem.l    d0-d2/a0-a1,-(sp)
  2050.     moveq.l    #0,d0            *レジスタ・ワークの初期化
  2051.     lea    r06_0-work(a6),a0
  2052.     move.l    d0,(a0)+        *r06_0,r06_1,wr1,dummy
  2053.     move.b    midi_board-work(a6),d2
  2054.     beq    exit_i_mdbd_
  2055.     btst.l    #if_m0,d2
  2056.     beq    @f
  2057.     lea    rgr,a0
  2058.     moveq.l    #$80,d1
  2059.     bsr    init_cz6bm1
  2060. @@:
  2061.     btst.l    #if_m1,d2
  2062.     beq    @f
  2063.     lea    rgr+$10,a0
  2064.     moveq.l    #$a0,d1
  2065.     bsr    init_cz6bm1
  2066. @@:
  2067.     btst.l    #if_mr0,d2
  2068.     beq    exit_i_mdbd_
  2069.     lea    rs_data(pc),a0
  2070.     moveq.l    #(rs_data_e-rs_data)-1,d0
  2071.     lea    scc_a,a1
  2072.     tst.b    (a1)            *dummy read
  2073. @@:
  2074.     move.b    (a0)+,(a1)
  2075.     dbra    d0,@b
  2076.     move.b    #1,(a1)
  2077.     moveq.l    #%0000_0010,d0
  2078.     move.b    d0,wr1-work(a6)
  2079.     move.b    d0,(a1)
  2080. exit_i_mdbd_:
  2081.     movem.l    (sp)+,d0-d2/a0-a1
  2082.     move.w    (sp)+,sr
  2083. exit_i_mdbd:
  2084.     rts
  2085.  
  2086. init_cz6bm1:
  2087.     * < d1=vector offset
  2088.     * < a0=rgr
  2089.     * X d0-d1/a0-a1
  2090.     move.b    #$80,(a0)    *initial reset
  2091.     moveq.l    #0,d0        *1/60/512=0.000032secのウエイト
  2092.     jsr    h_wait-work(a6)
  2093.     clr.b    (a0)        *initial reset end
  2094.     midiwait
  2095.     move.b    d1,grp4-rgr(a0)    *write vector offset
  2096.     midiwait
  2097.     lea    md_init_tbl_i(pc),a1
  2098.     cmpi.b    #1,timer_mode-work(a6)
  2099.     beq    @f
  2100.     lea    md_init_tbl_e(pc),a1
  2101. @@:
  2102.     move.b    (a1)+,d0
  2103.     beq    @f
  2104.     move.b    d0,d1
  2105.     lsr.b    #4,d0
  2106.     move.b    d0,(a0)
  2107.     midiwait
  2108.     andi.w    #$0f,d1
  2109.     add.w    d1,d1
  2110.     move.b    (a1)+,ivr-rgr(a0,d1.w)
  2111.     midiwait
  2112.     bra    @b
  2113. @@:
  2114.     rts
  2115.  
  2116. md_init_tbl_i:            *X680x0がホストケース
  2117.     dc.b    $06,%00000000
  2118.     dc.b    $66,%00000010
  2119.     dc.b    $67,%00011000
  2120.     dc.b    $65,%10010100
  2121.     dc.b    $55,%10000101
  2122.     dc.b    $44,%00001000
  2123.     dc.b    $35,%10010000
  2124.     dc.b    $24,%00001000
  2125.     dc.b    $25,%00000000
  2126.     dc.b    $05,%00000010
  2127.     dc.b    $03,%11111111
  2128.     dc.b    $14,%00101011
  2129.     dc.b    $94,%00000000
  2130.     dc.b    $35,%11010001
  2131.     dc.b    $55,%10000001
  2132.     dc.b    0
  2133.  
  2134. md_init_tbl_e:            *外部シーケンサがホストケース
  2135.     dc.b    $06,%00000000
  2136.     dc.b    $66,%00000010
  2137.     dc.b    $67,%00011000
  2138.     dc.b    $65,%10010100
  2139.     dc.b    $55,%10000101
  2140.     dc.b    $44,%00001000
  2141.     dc.b    $35,%10010000
  2142.     dc.b    $24,%00001000
  2143.     dc.b    $25,%00000000
  2144.     dc.b    $05,%00000010
  2145.     dc.b    $03,%11111111
  2146.     dc.b    $14,%00111001
  2147.     dc.b    $94,%00000000
  2148.     dc.b    $35,%11010001
  2149.     dc.b    $55,%10000001
  2150.     dc.b    $75,%00110001
  2151.     dc.b    0
  2152.  
  2153. *    .dc.b    $09,$80,$04,$44,$01,$00,$03,$c0        *Ussy's Library
  2154. *    .dc.b    $05,$e2,$09,$01,$0b,$50,$0e,$02
  2155. *    .dc.b    $0c,$03,$0d,$00,$03,$c1,$05,$ea
  2156. *    .dc.b    $0e,$03,$10,$10,$01,$12,$09,$09
  2157. rs_data:
  2158.     dc.b    $09,$80,$04,$44,$01,$00,$03,$c0        *Z's(5MHz)
  2159.     dc.b    $05,$e2,$09,$01,$0b,$50,$0e,$02
  2160.     dc.b    $0c
  2161. bps_v:    dc.b    $03                    *3:31250,2:39062
  2162.     dc.b        $0d,$00,$03,$c1,$05,$ea
  2163.     dc.b    $0e,$03,$10,$10,$01,$12,$0f,$00
  2164.     dc.b    $c0,$10,$30,$38,$02,$50,$09,$09
  2165. rs_data_e:
  2166.     .even
  2167.  
  2168. init_opmwk:            *FM音源チャンネルワークの初期化
  2169.     * X d0,a1        *-Vスイッチによりパッチが当たる(bra exit_ifmwk)
  2170.     lea    _opm-work(a6),a1
  2171.     moveq.l    #256/4-1,d0
  2172. @@:
  2173.     clr.l    (a1)+
  2174.     dbra    d0,@b
  2175.     move.l    #$00010203,opm_kon+0-work(a6)
  2176.     move.l    #$04050607,opm_kon+4-work(a6)
  2177.     lea    cf-work(a6),a1
  2178.     moveq.l    #10-1,d0
  2179. @@:
  2180.     clr.l    (a1)+
  2181.     dbra    d0,@b
  2182. exit_ifmwk:
  2183.     rts
  2184.  
  2185. init_midiwk:            *MIDIのチャンネルワークの初期化
  2186.     * X d0,a0,a1,a2        *-Vスイッチによりパッチが当たる(bra exit_mdwk)
  2187.     lea    mm0_adr-work(a6),a0
  2188.     lea    midi_if_tbl-work(a6),a1
  2189. imdwklp0:
  2190.     moveq.l    #0,d0
  2191.     move.b    (a1)+,d0
  2192.     bmi    exit_mdwk
  2193.     add.w    d0,d0
  2194.     move.l    (a0,d0.w),a2
  2195.     moveq.l    #chwklen/4-1,d0
  2196. @@:
  2197.     move.l    #-1,(a2)+
  2198.     dbra    d0,@b
  2199.     bra    imdwklp0
  2200. exit_mdwk:
  2201.     rts
  2202.  
  2203. set_master_clock:            *全音符の絶対音長設定
  2204.     *   cmd=$0f
  2205.     * < a1.l=0の時は値の問い合わせのみ
  2206.     * < d1.l=0:通常音楽演奏用の設定,1:効果音演奏用の設定
  2207.     * < $00(a1).w=拍子(上位バイト:分子/下位バイト:分母)
  2208.     * < $02(a1).b=メトロノーム速度(音楽的音長)
  2209.     * < $03(a1).b=reserve
  2210.     * < $04(a1).w=調号(SMFの調号フォーマットに準拠)
  2211.     * < $06(a1).w=全音符の絶対音長
  2212.     * > a0.l=現在の設定値の格納アドレス
  2213.     *     パラメータの格納状況は上記に準ずる。
  2214.     ori.w    #$0700,sr
  2215.     lea    meter-work(a6),a0    *問い合わせ時にはこれがそのまま戻り値
  2216.     lea    set_new_t_max_min(pc),a2
  2217.     tst.l    d1
  2218.     beq    @f
  2219.     lea    meter_se-work(a6),a0    *問い合わせ時にはこれがそのまま戻り値
  2220.     lea    set_new_t_max_min_se(pc),a2
  2221. @@:
  2222.     move.l    a0,a3
  2223.     move.l    a1,d0
  2224.     beq    t_dat_ok
  2225.     cmpi.w    #max_note_len,6(a1)    *mst_clk max check
  2226.     bhi    t_illegal_note_length
  2227.     move.l    (a1)+,(a3)+        *meter(.w),metronome(.b),dummy(.b)同時格納
  2228.     move.l    (a1)+,(a3)+        *key(.w),mst_clk(.w)同時格納
  2229.     jsr    (a2)
  2230.     bra    t_dat_ok
  2231.  
  2232. reglist    reg    d0/a1-a2/a4
  2233. set_new_t_max_min_se:
  2234.     * (smc_work+4).w=_@t_max_se
  2235.     * a2.l=t_min_se
  2236.     * a4.l=_gyakusan_tm_X
  2237.     movem.l    reglist,-(sp)
  2238.     move.w    _@t_max_se-work(a6),smc_work+2-work(a6)
  2239.     lea    t_min_se-work(a6),a2
  2240.     move.l    gyakusan_table+4-work(a6),a4    *_gyakusan_tm_X
  2241.     bra    @f
  2242.  
  2243. set_new_t_max_min:
  2244.     * (smc_work+2).w=_@t_max
  2245.     * a2.l=t_min
  2246.     * a4.l=gyakusan_tm_X
  2247.     movem.l    reglist,-(sp)
  2248.     move.w    _@t_max-work(a6),smc_work+2-work(a6)
  2249.     lea    t_min-work(a6),a2
  2250.     move.l    gyakusan_table-work(a6),a4    *gyakusan_tm_X
  2251. @@:
  2252.     lea    smc_work+4-work(a6),a1
  2253.     jsr    (a4)            *> d0.w=tempo value d1.w=timer value
  2254.     cmpi.w    #100,d0            *適当なテンポ
  2255.     bls    @f            *この値より小さければ最低テンポ値とみなす
  2256.     move.w    d0,2(a2)        *t_max
  2257.     bra    1f
  2258. @@:
  2259.     move.w    d0,(a2)+        *t_min
  2260. 1:
  2261.     lea    smc_work+2-work(a6),a1
  2262.     move.w    #1,(a1)+        *min timer value
  2263.     jsr    (a4)            *> d0.w=tempo value d1.w=timer value
  2264.     move.w    d0,(a2)            *t_max
  2265.     movem.l    (sp)+,reglist
  2266.     rts
  2267.  
  2268. m_play2:                *もう一度共通コマンドから再演奏
  2269.     *   cmd=$09
  2270.     move.l    trk_buffer_top-work(a6),d0
  2271.     beq    t_no_zmd_err        *ZMDがない
  2272.     moveq.l    #0,d2
  2273.     move.l    d0,a1
  2274.     move.l    #$00ff0000,mask_preserve-work(a6)    *マスクを保存して演奏するマーク
  2275.     bra    @f
  2276.  
  2277. play_zmd:                    *コンパイルデータの演奏
  2278.     *   cmd=$10
  2279.     * < d2.l=total data size d2がゼロならバッファへは転送せず即演奏
  2280.     *     サイズはヘッダ8バイト分は含んでも含まなくてもいい
  2281.     * < a1=play data address
  2282.     *  (a1)=data...(header8バイトの次から)
  2283.     * > d0.l=error code
  2284.     clr.l    mask_preserve-work(a6)        *マスクを初期化して演奏するマーク
  2285. @@:
  2286.     jbsr    stop_timer
  2287.     bsr    all_key_off2
  2288. _play_zmd:
  2289.     move.l    d2,d6                *サイズ保存
  2290.     tst.l    z_trk_offset-8(a1)        *演奏データなし
  2291.     beq    direct_play
  2292.     lea    meter-work(a6),a2
  2293.     lea    z_meter-8(a1),a0
  2294.     move.l    (a0)+,(a2)+            *meter(.w),metronome(.b),dummy(.b)
  2295.     move.l    (a0)+,d0            *key(.w),mst_clk(.w)
  2296.     move.l    (a2),d1
  2297.     move.l    d0,(a2)+
  2298.     move.w    (a0)+,(a2)+            *tempo_value(.w)
  2299.     cmp.w    d0,d1
  2300.     beq    @f
  2301.     bsr    set_new_t_max_min
  2302. @@:
  2303.     moveq.l    #0,d2
  2304.     move.l    d2,fm_tune_tbl-work(a6)
  2305.     move.l    d2,pcm_tune_tbl-work(a6)
  2306.     init_pmod_wk    agogik_base,d2,a6
  2307.     bsr    calc_timer
  2308.  
  2309.     move.l    d6,d2                *d2=size
  2310.     beq    direct_play
  2311.     move.l    #ID_ZMD,d3            *employment
  2312.     bsr    get_mem                *>a0.l=address,d0.l=error code
  2313.     tst.l    d0
  2314.     bmi    t_out_of_memory
  2315.     move.l    a0,trk_buffer_top-work(a6)
  2316.     move.l    d2,trk_buffer_size-work(a6)    *d2=long word border size
  2317.     lea    (a0,d2.l),a2
  2318.     move.l    a2,trk_buffer_end-work(a6)
  2319.     move.l    a0,a2                *a0=a2=destination
  2320. @@:                        *ZMDを用意したバッファへ転送
  2321.     move.l    (a1)+,(a0)+
  2322.     subq.l    #4,d2
  2323.     bne    @b
  2324.     bra    do_comn_cmd
  2325. direct_play:
  2326.     move.l    a1,a2
  2327.     move.l    a1,trk_buffer_top-work(a6)
  2328.     move.l    d2,trk_buffer_size-work(a6)    *d2=long word border size
  2329.     add.l    d2,a1
  2330.     move.l    a1,trk_buffer_end-work(a6)
  2331. do_comn_cmd:
  2332.     st.b    play_bak_flg-work(a6)    *m_play2パラメータ初期化
  2333.     move.l    (a2)+,d0        *共通コマンドの有無チェック(有ればその値がオフセット)
  2334.     beq    @f
  2335.     move.l    a2,-(sp)
  2336.     add.l    d0,a2
  2337.     bsr    exec_comn_cmd        *共通コマンド実行
  2338.                     *set information block & play
  2339.     move.l    (sp)+,a2
  2340. @@:
  2341.     move.l    (a2)+,d0
  2342.     pea.l    (a2)            *後で使用
  2343.     beq    exec_ctrl_cmd        *演奏データ無し
  2344.     add.l    d0,a2
  2345.     move.w    (a2)+,d5        *num of trks(0-65534)
  2346.     cmp.w    trk_n_max-work(a6),d5
  2347.     bcs    @f
  2348.     bsr    spread_trk_n            *トラック数限界値拡張処理へ
  2349.     bmi    t_out_of_memory
  2350. @@:
  2351.     move.l    a2,trk_po_tbl-work(a6)
  2352.                         *各トラックの先頭アドレスをワークへセット
  2353.     move.l    play_trk_tbl-work(a6),a3
  2354.     movea.l    seq_wk_tbl-work(a6),a5
  2355.     moveq.l    #0,d3
  2356.     lea    ii_bit_work-work(a6),a4
  2357.     move.l    d3,(a4)+        *ii_fm_bitからii_mr1_bitまでを初期化
  2358.     move.l    d3,(a4)+
  2359.     move.l    d3,(a4)+
  2360. set_i_lp01:
  2361. do_top_ptr_set    macro    para
  2362.     local    pcd_md,pcd_ad,pcd_fm,pcd_dvset,exit_pcd
  2363.     move.l    (a2)+,d4
  2364.     bpl    @f            *演奏トラックではない場合(rec or pattern)
  2365.     subq.w    #4,a2
  2366.     move.l    a2,pattern_trk-work(a6)
  2367.     .if    (para=1)
  2368.     lea    ti_size(a2),a2        *次のトラック追加情報までのオフセットスキップ
  2369.     .endif
  2370.     bra    exit_pcd
  2371. @@:
  2372.     .if    (para=1)
  2373.     move.w    d3,(a3)+
  2374.     .endif
  2375.     move.l    a5,a1
  2376.     move.w    #$0001,(a1)+        *dummy step time
  2377.     move.l    d4,(a1)+        *p_track_stat,p_track_mode,p_trkfrq,p_trkfrq_wk
  2378.     move.w    (a2)+,d4        *p_type
  2379.     beq    pcd_fm            *FMの場合
  2380.     bpl    pcd_ad            *ADPCMの場合
  2381. pcd_md:                    *MIDIの場合
  2382.     move.l    #int_play_ope_md,p_int_play_ope(a5)
  2383.     cmpi.w    #$ffff,d4        *current midi ?
  2384.     bne    @f
  2385.     move.w    current_midi_out_w-work(a6),d4
  2386.     move.w    current_midi_out_r-work(a6),p_midi_if(a5)
  2387.     bra    1f
  2388. @@:
  2389.     ext.w    d4
  2390.     move.w    d4,p_midi_if(a5)
  2391.     lea    midi_if_tbl-work(a6),a4
  2392.     move.b    (a4,d4.w),d4        *0,2,4
  2393.     andi.w    #$7f,d4
  2394. 1:
  2395.     move.w    d4,d1
  2396.     lsr.b    #1,d4            *0,1,2
  2397.     ori.w    #$8000,d4
  2398.     moveq.l    #0,d0
  2399.     move.w    @f(pc,d1.w),d0
  2400.     lea    @f(pc,d0.l),a4
  2401.     move.l    a4,p_midi_trans(a5)
  2402.     lsl.w    #3,d1            *これで16倍
  2403.     lea    fo_ch_m0-work(a6,d1.w),a4
  2404.     swap    d4
  2405.     move.w    (a2)+,d4        *p_ch
  2406.     move.l    d4,(a1)+        *p_type(a5)
  2407.     clr.b    (a4,d4.w)        *init fader flag work
  2408.     jbsr    init_wks_md
  2409.     jsr    init_inst_md-work(a6)
  2410.     bra    pcd_dvset
  2411. @@:
  2412.     dc.w    m_out_m0-@b
  2413.     dc.w    m_out_m1-@b
  2414.     dc.w    m_out_r0-@b
  2415.     dc.w    m_out_r1-@b
  2416. pcd_ad:
  2417.     move.l    #int_play_ope_ad,p_int_play_ope(a5)
  2418.     swap    d4
  2419.     move.w    (a2)+,d4        *p_ch
  2420.     move.l    d4,(a1)+        *p_type(a5)
  2421.     clr.b    fo_ch_ad-work(a6,d4.w)    *init fader flag work
  2422.     jbsr    init_wks_ad
  2423.     jsr    init_inst_ad-work(a6)
  2424.     bra    pcd_dvset
  2425. pcd_fm:
  2426.     move.l    #int_play_ope_fm,p_int_play_ope(a5)
  2427.     swap    d4
  2428.     move.w    (a2)+,d4        *p_ch
  2429.     move.l    d4,(a1)+        *p_type(a5)
  2430.     clr.b    fo_ch_fm-work(a6,d4.w)    *init fader flag work
  2431.     move.l    opmset_bsr_ms-work(a6),a4
  2432.     move.l    a4,p_opmset(a5)
  2433.     jsr    init_inst_fm-work(a6)    * < a4.l=opmset
  2434.     jbsr    init_wks_fm
  2435. pcd_dvset:
  2436.     move.l    (a2)+,a4        *演奏データまでのoffset
  2437.     add.l    a2,a4
  2438.     move.l    a4,(a1)+        *p_data_pointer
  2439.     move.l    a4,(a1)+        *p_now_pointer
  2440.     .if    (para=1)
  2441.     addq.w    #4,a2            *次のトラック追加情報までのオフセットスキップ
  2442.     addq.w    #1,d3            *トラック番号増加
  2443.     lea    trwk_size(a5),a5
  2444.     .endif
  2445. exit_pcd:
  2446.     endm
  2447.     do_top_ptr_set    1
  2448.     dbra    d5,set_i_lp01
  2449.  
  2450.     move.w    d5,(a3)            *set end code/write 255
  2451. exec_ctrl_cmd:
  2452.     move.l    (sp)+,a2        *演奏制御コマンドがあるか
  2453.     move.l    (a2)+,d0
  2454.     beq    m_play00
  2455.     add.l    d0,a2
  2456.     clr.b    ctrl_play_work-work(a6)    *ワーク初期化
  2457. ctrl_cmd_lp:
  2458.     moveq.l    #0,d1
  2459.     move.w    (a2)+,d1
  2460.     bmi    t_dat_ok        *end
  2461.     move.l    ctrl_cmd_tbl(pc,d1.w),a1
  2462.     jmp    (a1)
  2463.  
  2464. ctrl_cmd_tbl:
  2465.     dc.l    ctrl_play        *0
  2466.     dc.l    ctrl_stop        *2
  2467.     dc.l    ctrl_cont        *4
  2468.     dc.l    ctrl_mfader        *6
  2469.     dc.l    ctrl_tfader        *8
  2470.     dc.l    ctrl_tmask        *10
  2471. ctrl_cmd_tbl_end:
  2472. n4_of_ctrl_cmd:    equ    ctrl_cmd_tbl_end-ctrl_cmd_tbl
  2473.  
  2474. get_present_time:            *演奏開始時間記録
  2475. reglist    reg    d0/d2-d3/a2
  2476.     * > d1.l=現在時間(00HHMMSS)
  2477.     movem.l    reglist,-(sp)
  2478. @@:
  2479.     lea    $e8a00c,a2        *演奏開始時間を記録しておく
  2480.     bclr.b    #0,$e8a01b-$e8a00c(a2)    *bank 0
  2481.     move.w    -(a2),d2        *hour
  2482.     andi.w    #$0f,d2
  2483.     lsl.w    #4,d2
  2484.     move.w    -(a2),d0
  2485.     andi.w    #$0f,d0
  2486.     or.w    d0,d2
  2487.     swap    d2
  2488.     move.w    -(a2),d2        *minute
  2489.     andi.w    #$0f,d2
  2490.     lsl.w    #4,d2
  2491.     move.w    -(a2),d0
  2492.     andi.w    #$0f,d0
  2493.     or.w    d0,d2
  2494.     lsl.w    #8,d2
  2495.     move.w    -(a2),d3        *second
  2496.     andi.w    #$0f,d3
  2497.     lsl.w    #4,d3
  2498.     move.w    -(a2),d0
  2499.     andi.w    #$0f,d0
  2500.     or.w    d0,d2
  2501.     or.w    d3,d2
  2502.  
  2503.     lea    $e8a00c,a2        *演奏開始時間を記録しておく
  2504.     move.w    -(a2),d1        *hour
  2505.     andi.w    #$0f,d1
  2506.     lsl.w    #4,d1
  2507.     move.w    -(a2),d0
  2508.     andi.w    #$0f,d0
  2509.     or.w    d0,d1
  2510.     swap    d1
  2511.     move.w    -(a2),d1        *minute
  2512.     andi.w    #$0f,d1
  2513.     lsl.w    #4,d1
  2514.     move.w    -(a2),d0
  2515.     andi.w    #$0f,d0
  2516.     or.w    d0,d1
  2517.     lsl.w    #8,d1
  2518.     move.w    -(a2),d3        *second
  2519.     andi.w    #$0f,d3
  2520.     lsl.w    #4,d3
  2521.     move.w    -(a2),d0
  2522.     andi.w    #$0f,d0
  2523.     or.w    d0,d1
  2524.     or.w    d3,d1
  2525.  
  2526.     cmp.l    d1,d2            *時間読み込みエラー防止のため
  2527.     bne    @b
  2528.     movem.l    (sp)+,reglist
  2529.     rts
  2530.  
  2531. ctrl_play:            *play(演奏開始)
  2532.     move.w    #ZM_PLAY,fnc_no-work(a6)
  2533.     cmpi.w    #-1,(a2)
  2534.     bne    @f
  2535.     pea    2(a2)        *skip -1 mark
  2536.     suba.l    a1,a1        *a1=0
  2537.     bsr    m_play
  2538.     move.l    (sp)+,a2
  2539.     bra    ctrl_cmd_lp
  2540. @@:
  2541.     tas.b    ctrl_play_work-work(a6)
  2542.     bmi    1f
  2543.     move.l    play_trk_tbl-work(a6),a1
  2544. @@:
  2545.     moveq.l    #0,d0
  2546.     move.w    (a1)+,d0
  2547.     cmpi.w    #-1,d0
  2548.     beq    1f
  2549.     calc_wk    d0
  2550.     tas.b    p_track_stat(a5)    *make Dead
  2551.     bra    @b
  2552. 1:
  2553.     move.l    a2,a1
  2554.     bsr    m_play
  2555.     move.l    a1,a2
  2556.     bra    ctrl_cmd_lp
  2557.  
  2558. ctrl_stop:            *stop(演奏停止)
  2559.     move.w    #ZM_STOP,fnc_no-work(a6)
  2560.     cmpi.w    #-1,(a2)
  2561.     bne    @f
  2562.     addq.w    #2,a2        *skip -1 mark
  2563.     suba.l    a1,a1        *a1=0
  2564.     bsr    m_stop
  2565.     bra    ctrl_cmd_lp
  2566. @@:
  2567.     move.l    a2,a1
  2568.     bsr    m_stop
  2569.     move.l    a1,a2
  2570.     bra    ctrl_cmd_lp
  2571.  
  2572. ctrl_cont:            *continue(演奏再開)
  2573.     move.w    #ZM_CONT,fnc_no-work(a6)
  2574.     cmpi.w    #-1,(a2)
  2575.     bne    @f
  2576.     addq.w    #2,a2        *skip -1 mark
  2577.     suba.l    a1,a1        *a1=0
  2578.     bsr    m_cont
  2579.     bra    ctrl_cmd_lp
  2580. @@:
  2581.     move.l    a2,a1
  2582.     bsr    m_cont
  2583.     move.l    a1,a2
  2584.     bra    ctrl_cmd_lp
  2585.  
  2586. ctrl_mfader:            *master_fader(マスターフェーダー)
  2587.     move.w    #ZM_MASTER_FADER,fnc_no-work(a6)
  2588.     move.l    a2,a1
  2589.     bsr    master_fader
  2590.     move.l    a1,a2
  2591.     bra    ctrl_cmd_lp
  2592.  
  2593. ctrl_tfader:            *track_fader(トラックフェーダー)
  2594.     move.w    #ZM_SET_TR_OUTPUT_LEVEL,fnc_no-work(a6)
  2595.     move.l    a2,a1
  2596.     bsr    set_tr_output_level
  2597.     move.l    a1,a2
  2598.     bra    ctrl_cmd_lp
  2599.  
  2600. ctrl_tmask:            *track_mask(トラックマスク)
  2601.     move.w    #ZM_MASK_TRACKS,fnc_no-work(a6)
  2602.     move.l    #$00ff0000,mask_preserve-work(a6)    *マスクを保存して演奏するマーク 97/4/8
  2603.     cmpi.w    #-1,(a2)
  2604.     bne    @f
  2605.     addq.w    #2,a2        *skip -1 mark
  2606.     suba.l    a1,a1        *a1=0
  2607.     moveq.l    #0,d1        *0:enable
  2608.     move.w    (a2)+,d1    *mode(-1,0,+1)
  2609.     bsr    mask_tracks
  2610.     bra    ctrl_cmd_lp
  2611. @@:
  2612.     move.l    a2,a1
  2613.     bsr    mask_tracks
  2614.     move.l    a1,a2
  2615.     bra    ctrl_cmd_lp
  2616.  
  2617. all_key_off2:            *演奏中の全チャンネルをノートオフする
  2618. reglist    reg    d0-d5/a2-a5
  2619.     movem.l    reglist,-(sp)
  2620.     move.l    play_trk_tbl-work(a6),a2
  2621. ako2_lp:
  2622.     moveq.l    #0,d0
  2623.     move.w    (a2)+,d0
  2624.     cmpi.w    #-1,d0
  2625.     beq    ako2_exit
  2626.     calc_wk    d0
  2627.     tst.b    p_track_stat(a5)        *play_end,dead?
  2628.     bne    ako2_next            *既に停止中
  2629.     move.l    p_type(a5),d4
  2630.     bsr    _ms_key_off
  2631. ako2_next:
  2632.     ori.b    #ID_PLAY_STOP,p_track_stat(a5)    *st.b    p_track_stat(a5)
  2633.     bra    ako2_lp
  2634. ako2_exit:
  2635.     movem.l    (sp)+,reglist
  2636.     rts
  2637.  
  2638. spread_trk_n:                *トラック関連のワーク確保
  2639.     * < d5.l=new track max(0/1-65535)
  2640.     * - all
  2641. reglist    reg    d0/d2-d3/d5/a0-a1
  2642.     andi.l    #$ffff,d5
  2643.     beq    exit_sptrk        *0ならば処理無し
  2644.     movem.l    reglist,-(sp)
  2645.     addq.l    #8,d5            *上限を増やす
  2646.     cmpi.l    #tr_max,d5
  2647.     bls    @f
  2648.     move.l    #tr_max,d5
  2649. @@:
  2650.     move.l    d5,d2            *seq_wk_tblのサイズ
  2651.     swap    d2
  2652.     lsr.l    #16-trwk_size_,d2
  2653.  
  2654.     move.l    d5,d0
  2655.     addq.l    #1,d0            *+1
  2656.     add.l    d0,d0            *x2
  2657.     move.l    d0,-(sp)
  2658.     add.l    d0,d2            *play_trk_tblのサイズ
  2659.     add.l    d0,d2            *play_bakのサイズ
  2660.  
  2661.     move.l    d5,d0
  2662.     lsr.l    #3,d0            */8
  2663.     addq.l    #2,d0            *最低でも2バイトにしたいから
  2664.     bclr.l    #0,d0            *.even
  2665.     move.l    d0,-(sp)
  2666.     add.l    d0,d2            *done_bitのサイズ
  2667.  
  2668.     move.l    d5,d0
  2669.     addq.l    #1,d0            *+1
  2670.     lsl.l    #2,d0            *×4
  2671.     move.l    d0,-(sp)
  2672.     lsl.l    #3,d0
  2673.     add.l    d0,d2            *result系のサイズ×nof_result(8)
  2674.  
  2675.     move.l    _result_start-work(a6),d0    *enlarge or get?
  2676.     bne    enlrg_sqtb
  2677.     move.l    #ID_SYSTEM,d3        *ID
  2678.     bsr    get_mem
  2679.     tst.l    d0
  2680.     bpl    @f
  2681.     bra    err_exit_sptrk
  2682. enlrg_sqtb:
  2683.     move.l    d0,a1            *addr
  2684.     bsr    enlarge_mem
  2685.     tst.l    d0
  2686.     bmi    err_exit_sptrk
  2687. @@:
  2688.     lea    _result_start-work(a6),a1
  2689.     moveq.l    #nof_result-1,d0
  2690.     move.l    (sp)+,d2        *get back result系size
  2691. @@:
  2692.     move.l    a0,(a1)+
  2693.     add.l    d2,a0
  2694.     dbra    d0,@b
  2695.  
  2696.     move.l    a0,done_bit-work(a6)
  2697.     add.l    (sp)+,a0        *get back don_bit size
  2698.  
  2699.     move.l    (sp)+,d2        *get back play_trk_tbl(&play_bak) size
  2700.     move.l    a0,play_trk_tbl-work(a6)
  2701.     move.w    #-1,(a0)            *初期化
  2702.     add.l    d2,a0
  2703.  
  2704.     move.l    a0,play_bak-work(a6)
  2705.     move.w    #-1,(a0)            *初期化
  2706.     add.l    d2,a0
  2707.  
  2708.     lea    128(a0),a0        *seq_wk_tbl系ワークはベースアドレスよりも
  2709.     move.l    a0,seq_wk_tbl-work(a6)    *128バイト手前をアクセスすることがあるから
  2710.     move.w    d5,trk_n_max-work(a6)
  2711. exit_sptrk:
  2712.     moveq.l    #0,d0            *no error mark
  2713.     movem.l    (sp)+,reglist
  2714.     rts
  2715. err_exit_sptrk:                *メモリ不足エラー
  2716.     lea    4*3(sp),sp
  2717.     moveq.l    #-1,d0            *error mark
  2718.     movem.l    (sp)+,reglist
  2719.     rts
  2720.  
  2721. play_zmd_se:            *コンパイルデータの効果音サイド演奏
  2722.     *   cmd=$11
  2723.     * < a1=play data address
  2724.     *  (a1)=data...(header8バイトの次から)
  2725.     clr.l    mask_preserve-work(a6)        *マスクを初期化して演奏するマーク
  2726.     bsr    stop_timer_se
  2727.     lea    meter_se-work(a6),a2
  2728.     lea    z_meter-8(a1),a0
  2729.     move.l    (a0)+,(a2)+            *meter(.w),metronome(.b),dummy(.b)
  2730.     move.l    (a0)+,d0            *key(.w),mst_clk(.w)
  2731.     move.l    (a2),d1
  2732.     move.l    d0,(a2)+
  2733.     move.w    (a0)+,(a2)+            *tempo_value(.w)
  2734.     cmp.w    d0,d1
  2735.     beq    @f
  2736.     bsr    set_new_t_max_min_se
  2737. @@:
  2738.     moveq.l    #0,d2
  2739.     move.l    d2,fm_tune_tbl-work(a6)
  2740.     move.l    d2,pcm_tune_tbl-work(a6)
  2741.     init_pmod_wk    agogik_base_se,d2,a6        *< d2=0
  2742.     bsr    calc_timer_se
  2743.  
  2744.     move.l    a1,a2
  2745.     move.l    (a2)+,d0    *共通コマンドの有無チェック
  2746.     beq    @f
  2747.     move.l    a2,-(sp)
  2748.     add.l    d0,a2
  2749.     bsr    exec_comn_cmd_se    *共通コマンド実行
  2750.                 *set information block & play
  2751.     move.l    (sp)+,a2
  2752.     move.l    (a2)+,d0    *演奏データまでのオフセット
  2753.     beq    t_dat_ok
  2754.     add.l    d0,a2
  2755.     move.w    (a2)+,d5    *num of trks
  2756.     cmp.w    se_tr_max(pc),d5
  2757.     bls    @f
  2758.     move.w    se_tr_max(pc),d5
  2759. @@:                *各トラックの先頭アドレスをワークへセット
  2760.     move.l    a2,trk_po_tbl_se-work(a6)
  2761.     move.l    play_trk_tbl_se-work(a6),a3
  2762.     movea.l    seq_wk_tbl_se-work(a6),a5
  2763.     moveq.l    #0,d3
  2764. set_i_lp01_se:
  2765.     move.l    (a2)+,d4
  2766.     bpl    @f
  2767.     subq.w    #4,a2
  2768.     move.l    a2,pattern_trk_se-work(a6)
  2769.     lea    ti_size(a2),a2
  2770.     bra    exit_pcd_se
  2771. @@:
  2772.     move.w    d3,(a3)+
  2773.     move.l    a5,a1
  2774.     move.w    #$0001,(a1)+        *dummy step time
  2775.     bset.l    #24+_ID_SE,d4
  2776.     move.l    d4,(a1)+        *p_track_stat,p_track_mode,p_trkfrq,p_trkfrq_wk
  2777.     move.w    (a2)+,d4        *get p_type
  2778.     beq    pcd_fm_se
  2779.     bpl    pcd_ad_se
  2780.     move.l    #int_play_ope_md,p_int_play_ope(a5)
  2781.     cmpi.w    #$ffff,d4
  2782.     bne    @f
  2783.     move.w    current_midi_out_w(pc),d4
  2784.     move.w    current_midi_out_r(pc),p_midi_if(a5)
  2785.     bra    1f
  2786. @@:
  2787.     ext.w    d4
  2788.     move.w    d4,p_midi_if(a5)
  2789.     lea    midi_if_tbl(pc),a4
  2790.     move.b    (a4,d4.w),d4        *0,2,4
  2791.     andi.w    #$7f,d4
  2792. 1:
  2793.     move.w    d4,d1
  2794.     lsr.b    #1,d4            *0,1,2
  2795.     ori.w    #$8000,d4
  2796.     moveq.l    #0,d0
  2797.     move.w    @f(pc,d1.w),d0
  2798.     lea    @f(pc,d0.l),a4
  2799.     move.l    a4,p_midi_trans(a5)
  2800.     swap    d4
  2801.     move.w    (a2)+,d4        *get p_ch
  2802.     move.l    d4,(a1)+        *p_type,p_ch
  2803.     bsr    ms_key_off_md
  2804.     bsr    init_wks_md
  2805.     bra    pcd_dvset_se
  2806. @@:
  2807.     dc.w    m_out_m0-@b
  2808.     dc.w    m_out_m1-@b
  2809.     dc.w    m_out_r0-@b
  2810.     dc.w    m_out_r1-@b
  2811. pcd_ad_se:
  2812.     move.l    #int_play_ope_ad,p_int_play_ope(a5)
  2813.     swap    d4
  2814.     move.w    (a2)+,d4        *get p_ch
  2815.     move.l    d4,(a1)+        *p_type,p_ch
  2816.     bsr    ms_key_off_ad
  2817.     bsr    init_wks_ad
  2818.     bra    pcd_dvset_se
  2819. pcd_fm_se:
  2820.     move.l    #int_play_ope_fm,p_int_play_ope(a5)
  2821.     swap    d4
  2822.     move.w    (a2)+,d4        *get p_ch
  2823.     move.l    d4,(a1)+        *p_type,p_ch
  2824.     move.w    sr,-(sp)
  2825.     ori.w    #$0700,sr
  2826.     bset.b    d4,mask_opm_ch-work(a6)    *効果音モードFMレジスタマスク
  2827.     lea    opmset-work(a6),a4
  2828.     move.l    a4,p_opmset(a5)
  2829.     bsr    ms_key_off_fm
  2830.     bsr    init_inst_fm        *< a4.l=opmset
  2831.     move.w    (sp)+,sr
  2832.     bsr    init_wks_fm
  2833. pcd_dvset_se:
  2834.     move.l    (a2)+,a4        *演奏データまでのoffset
  2835.     add.l    a2,a4
  2836.     move.l    a4,(a1)+        *p_data_pointer
  2837.     move.l    a4,(a1)+        *p_now_pointer
  2838.     addq.w    #4,a2            *トラック追加情報までのオフセットスキップ
  2839.     addq.w    #1,d3
  2840.     lea    trwk_size(a5),a5
  2841. exit_pcd_se:
  2842.     dbra    d5,set_i_lp01_se
  2843.  
  2844.     move.b    d5,(a3)            *set end code/write 255
  2845.     ori.w    #$0700,sr
  2846.     bra    init_timer_se
  2847.  
  2848. se_play:            *効果音モードプレイ
  2849.     *   cmd=$12        高速処理が要求されるのでパラメータチェックは無し
  2850.     * < a1.l=compiled data address
  2851.     * (a1).w=total of play trks...(トラック・チャンネル情報テーブルから)
  2852.     * PMD,AMDは初期化されない
  2853. se_play_patch:                    *この部分は始めの一回しか実行されない
  2854.     move.l    #$00c0_0078,mst_clk_se-work(a6)    *master_clock(.w),tempo_value(.w)
  2855.     bsr    set_new_t_max_min_se
  2856.     moveq.l    #0,d2
  2857.     move.l    d2,fm_tune_tbl-work(a6)
  2858.     move.l    d2,pcm_tune_tbl-work(a6)
  2859.     init_pmod_wk    agogik_base_se,d2,a6    *< d2=0
  2860.     bsr    calc_timer_se
  2861.     patch_w2    BRA,se_play_patch,go_se_play
  2862.     bsr    cache_flush
  2863. go_se_play:
  2864. *    clr.l    mask_preserve-work(a6)        *マスクを初期化して演奏するマーク
  2865.     move.w    (a1)+,d5            *num of trks
  2866. *    ori.w    #$700,sr
  2867.     bsr    stop_timer_se
  2868. sepl_lp01:
  2869.     move.l    (a1),d2
  2870.     bpl    @f
  2871.     move.l    a1,pattern_trk_se-work(a6)
  2872. @@:
  2873.     bset.l    #24+_ID_SE,d2        *p_track_stat,p_track_mode,p_trkfrq,p_trkfrq_wk
  2874.     addq.w    #4,a1
  2875.     move.w    (a1)+,d4        *get p_type
  2876.     beq    _pcd_fm_se
  2877.     bpl    _pcd_ad_se
  2878.     move.l    #int_play_ope_md,d1
  2879.     cmpi.w    #$ffff,d4
  2880.     bne    @f
  2881.     move.w    current_midi_out_w(pc),d4
  2882.     move.w    current_midi_out_r(pc),d6
  2883.     bra    1f
  2884. @@:
  2885.     ext.w    d4
  2886.     move.w    d4,d6
  2887.     lea    midi_if_tbl(pc),a4
  2888.     move.b    (a4,d4.w),d4        *0,2,4
  2889.     andi.w    #$7f,d4
  2890. 1:
  2891.     move.w    d4,d3
  2892.     lsr.b    #1,d4            *0,1,2
  2893.     ori.w    #$8000,d4
  2894.     moveq.l    #0,d0
  2895.     move.w    @f(pc,d3.w),d0
  2896.     lea    @f(pc,d0.l),a4
  2897.     swap    d4
  2898.     move.w    (a1)+,d4        *get p_ch
  2899.     lea    init_wks_md(pc),a2
  2900.     lea    ms_key_off_md(pc),a0
  2901.     bra    _pcd_dvset_se
  2902. @@:
  2903.     dc.w    m_out_m0-@b
  2904.     dc.w    m_out_m1-@b
  2905.     dc.w    m_out_r0-@b
  2906.     dc.w    m_out_r1-@b
  2907. _pcd_ad_se:
  2908.     move.l    #int_play_ope_ad,d1
  2909.     swap    d4
  2910.     move.w    (a1)+,d4        *get p_ch
  2911.     lea    init_wks_ad(pc),a2
  2912.     lea    ms_key_off_ad(pc),a0
  2913.     bra    _pcd_dvset_se
  2914. _pcd_fm_se:
  2915.     move.l    #int_play_ope_fm,d1
  2916.     swap    d4
  2917.     move.w    (a1)+,d4        *get p_ch
  2918.     bset.b    d4,mask_opm_ch-work(a6)    *効果音モードFMレジスタマスク
  2919.     lea    opmset-work(a6),a4
  2920.     lea    init_wks_fm(pc),a2
  2921.     bsr    init_inst_fm        *< a4.l=opmset
  2922.     lea    ms_key_off_fm(pc),a0
  2923. _pcd_dvset_se:
  2924.     move.l    (a1)+,d7        *d7.l=演奏データまでのoffset
  2925.     add.l    a1,d7
  2926.     addq.l    #4,a1            *トラック追加情報までのオフセットスキップ
  2927.  
  2928.     move.l    play_trk_tbl_se-work(a6),a3
  2929.     moveq.l    #0,d3
  2930. @@:
  2931.     moveq.l    #0,d0
  2932.     move.w    (a3)+,d0
  2933.     cmpi.w    #-1,d0
  2934.     beq    set_new_sepl            *新規登録
  2935.     swap    d0
  2936.     lsr.l    #16-trwk_size_,d0
  2937.     movea.l    seq_wk_tbl_se-work(a6),a5
  2938.     adda.l    d0,a5                *a5=trk n seq_wk_tbl_se
  2939.     addq.w    #1,d3
  2940.     cmp.l    p_type(a5),d4            *同じデバイスがあるか
  2941.     bne    @b
  2942. sttrkprm:
  2943.     move.w    #$0001,(a5)        *p_step_time
  2944.     move.l    d2,p_track_stat(a5)    *p_track_stat,p_track_mode,p_trkfrq,p_trkfrq_wk
  2945.     move.l    d7,p_data_pointer(a5)    *set address
  2946.     move.l    d7,p_now_pointer(a5)    *set address
  2947.     move.l    d1,p_int_play_ope(a5)
  2948.     move.l    a4,p_midi_trans(a5)    *p_opmset(a5)
  2949.     move.w    d6,p_midi_if(a5)    *内蔵音源に取ってはダミー
  2950.     jsr    (a0)            *ms_key_off_xx
  2951.     jsr    (a2)            *init_wks_xx(効果音モード用演奏ワーク初期化(x a4))
  2952.     dbra    d5,sepl_lp01
  2953.     bra    init_timer_se
  2954.  
  2955. set_new_sepl:                *新規登録
  2956.     move.w    d3,-2(a3)        *set play trk tbl
  2957.     move.w    #-1,(a3)        *end mark
  2958.     move.l    d3,d0
  2959.     swap    d0
  2960.     lsr.l    #16-trwk_size_,d0
  2961.     movea.l    seq_wk_tbl_se-work(a6),a5
  2962.     adda.l    d0,a5            *a5=trk n seq_wk_tbl_se
  2963.     move.l    d4,p_type(a5)
  2964.     addq.w    #1,d3
  2965.     bra    sttrkprm
  2966.  
  2967. exec_comn_cmd:            *共通コマンド群の処理
  2968.     * < a2=comn data addr
  2969.     * X d0-d2,a0-a2/a5
  2970. pcd_lp01:
  2971.     moveq.l    #0,d0
  2972.     move.b    (a2)+,d0
  2973.     bmi    exit_ccd    *共通コマンドエンド
  2974.     move.l    cmncmdjtbl(pc,d0.w),a0
  2975.     jsr    (a0)
  2976.     bra    pcd_lp01
  2977. exit_ccd:
  2978. exit_ccd_se:
  2979.     rts
  2980. cmncmdjtbl:
  2981.     dc.l    cmn_init        *($00)initialize
  2982.     dc.l    cmn_read_sub        *($04)read & exec. cnf file
  2983.     dc.l    0            *($08)tempo
  2984.     dc.l    0            *($0c)全音符カウンタ/拍子セット
  2985.     dc.l    cmn_fm_tune_set        *($10)FM音源周波数テーブル
  2986.     dc.l    cmn_pcm_tune_set    *($14)PCM音源周波数テーブル
  2987.     dc.l    cmn_vset        *($18)ボイスセット
  2988.     dc.l    cmn_wave_form        *($1c)wave form setting
  2989.     dc.l    cmn_register_pcm    *($20)adpcm data cnf
  2990.     dc.l    cmn_erase_pcm        *($24)erase adpcm
  2991.     dc.l    cmn_block_adpcm        *($28)read a block data
  2992.     dc.l    cmn_crnt_midi_in    *($2c)current midi in
  2993.     dc.l    cmn_crnt_midi_out    *($30)current midi out
  2994.     dc.l    cmn_midi_trans        *($34)MIDI生データ転送
  2995.     dc.l    cmn_midi_dump        *($38)trans midi data dump
  2996.     dc.l    0            *($3c)
  2997.     dc.l    cmn_comment        *($40)comment
  2998.     dc.l    cmn_print        *($44)print message
  2999.     dc.l    cmn_dummy        *($48)dummy code
  3000.     dc.l    cmn_halt        *($4c)halt
  3001. cmncmdjtbl_end:
  3002. n4_of_cmn_cmd:    equ    cmncmdjtbl_end-cmncmdjtbl
  3003.  
  3004. exec_comn_cmd_se:                *共通コマンド群の処理(効果音サイド)
  3005.     * < a2=comn data addr
  3006.     * X d0-d2,a0-a2
  3007. pcd_lp01_se:
  3008.     moveq.l    #0,d0
  3009.     move.b    (a2)+,d0
  3010.     bmi    exit_ccd_se    *共通コマンドエンド
  3011.     move.l    cmncmdjtbl_se(pc,d0.w),a0
  3012.     jsr    (a0)
  3013.     bra    pcd_lp01_se
  3014. cmncmdjtbl_se:
  3015.     dc.l    cmn_init_se        *($00)初期化
  3016.     dc.l    cmn_read_sub_se        *($04)read & exec. cnf file
  3017.     dc.l    0            *($08)テンポ
  3018.     dc.l    0            *($0c)全音符カウンタ/拍子セット
  3019.     dc.l    cmn_fm_tune_set        *($10)FM音源周波数テーブル
  3020.     dc.l    cmn_pcm_tune_set    *($14)PCM音源周波数テーブル
  3021.     dc.l    cmn_vset        *($18)ボイスセット
  3022.     dc.l    cmn_wave_form        *($1c)wave form setting
  3023.     dc.l    cmn_register_pcm    *($20)adpcm data cnf
  3024.     dc.l    cmn_erase_pcm        *($24)erase adpcm
  3025.     dc.l    cmn_block_adpcm        *($28)read a block data
  3026.     dc.l    cmn_crnt_midi_in    *($2c)current midi in
  3027.     dc.l    cmn_crnt_midi_out    *($30)current midi out
  3028.     dc.l    cmn_midi_trans        *($34)MIDI生データ転送
  3029.     dc.l    cmn_midi_dump        *($38)trans midi data dump
  3030.     dc.l    0            *($3c)
  3031.     dc.l    cmn_comment        *($40)comment
  3032.     dc.l    cmn_print        *($44)print message
  3033.     dc.l    cmn_dummy        *($48)dummy code
  3034.     dc.l    cmn_halt_se        *($4c)halt
  3035.  
  3036.     *コンパイルデータの実行部
  3037.  
  3038. cmn_init:                *初期化(m_init相当)
  3039.     move.w    #ZM_INIT,fnc_no-work(a6)
  3040.     move.l    play_trk_tbl-work(a6),a1        *どのtrackがどのchannelへ
  3041.     move.w    #-1,(a1)                *アサインされているかを初期化
  3042.     bsr    init_mask_fader_work
  3043.     init_cmn_wks                    *共通ワーク初期化
  3044.     move.b    (a2)+,d1
  3045.     cmpi.b    #3,d1
  3046.     beq    @f
  3047.     cmpi.b    #2,d1
  3048.     bne    1f
  3049. @@:
  3050.     move.l    a2,-(sp)
  3051.     bsr    zmusic_mode        *モード変更
  3052.     move.l    (sp)+,a2
  3053. 1:
  3054.     rts
  3055.  
  3056. cmn_init_se:                *初期化(m_init相当)
  3057.     addq.w    #1,a2
  3058. cmn_dummy:                *なにもしないZMD
  3059.     rts
  3060.  
  3061. cmn_vset:                *FM音色設定
  3062.     move.w    #ZM_VSET,fnc_no-work(a6)
  3063.     moveq.l    #0,d1
  3064.     move.b    (a2)+,d1        *tone number(H)
  3065.     lsl.w    #8,d1
  3066.     move.b    (a2)+,d1        *tone number(L)
  3067.     moveq.l    #-1,d2
  3068.     lea    1(a2),a1        *skip dummy
  3069.     bsr    m_vset
  3070.     move.l    a1,a2
  3071.     rts
  3072.  
  3073. cmn_pcm_tune_set:            *PCM音源周波数テーブル
  3074.     move.l    a2,pcm_tune_tbl-work(a6)
  3075.     lea    128(a2),a2
  3076.     rts
  3077.  
  3078. cmn_fm_tune_set:            *FM音源周波数テーブル
  3079.     move.l    a2,fm_tune_tbl-work(a6)
  3080.     lea    128(a2),a2
  3081.     rts
  3082.  
  3083. cmn_crnt_midi_out:            *カレントMIDI-OUT
  3084.     move.w    #ZM_CURRENT_MIDI_OUT,fnc_no-work(a6)
  3085.     moveq.l    #0,d1
  3086.     move.b    (a2)+,d1
  3087.     bra    current_midi_out
  3088.  
  3089. cmn_crnt_midi_in:            *カレントMIDI-IN
  3090.     move.w    #ZM_CURRENT_MIDI_IN,fnc_no-work(a6)
  3091.     moveq.l    #0,d1
  3092.     move.b    (a2)+,d1
  3093.     bra    current_midi_in
  3094.  
  3095. cmn_midi_trans:            *MIDIデータ転送
  3096.     move.w    #ZM_MIDI_TRANSMISSION,fnc_no-work(a6)
  3097.     move.b    (a2)+,d1    *MIDI I/F(0-2/-1:current)
  3098.     ext.w    d1
  3099.     bsr    get_m_out_addr
  3100.     moveq.l    #0,d1
  3101.     move.b    (a2)+,d1    *str length(0-255)
  3102.     add.w    d1,a2        *skip comment str
  3103.     bsr    get_cm_l
  3104.     move.l    d0,d2        *n bytes
  3105.     movea.l    a2,a1
  3106.     add.l    d2,a2
  3107.     jmp    trans_midi_dat
  3108.  
  3109. cmn_halt:            *一時停止
  3110.     bsr    get_cm_l
  3111.     move.l    d0,d1
  3112. @@:
  3113.     bitsns    $0        *ESCを押せば終了
  3114.     btst.l    #1,d0
  3115.     bne    @f
  3116.     jsr    v_wait-work(a6)
  3117.     subq.l    #1,d1
  3118.     bne    @b
  3119. @@:
  3120.     rts
  3121.  
  3122. cmn_halt_se:            *一時停止(SEサイドでは無視)
  3123.     addq.w    #4,a2
  3124.     rts
  3125.  
  3126. cmn_register_pcm:
  3127.     move.w    #ZM_PCM_READ,fnc_no-work(a6)
  3128.     bsr    get_cm_l
  3129.     move.l    d0,d1        *flag of option existance/reg note number
  3130.     bsr    get_cm_l
  3131.     move.l    d0,d2        *d2.l=data type.b/original key code
  3132.     movea.l    a2,a1
  3133.     bsr    pcm_read
  3134.     move.l    a0,a2        *a2=更新された
  3135.     rts
  3136.  
  3137. cmn_erase_pcm:
  3138.     move.w    #ZM_PCM_READ,fnc_no-work(a6)
  3139.     bsr    get_cm_w
  3140.     move.l    d0,d1        *d1.w=note number to erase
  3141.     suba.l    a1,a1        *a1.l=0:erase_mode
  3142.     bra    pcm_read
  3143.  
  3144. cmn_comment:            *コメント行
  3145. srch_fn_end:            *ファイル名の場合
  3146.     tst.b    (a2)+
  3147.     bne    srch_fn_end    *ファイルネームのエンドを捜して
  3148.     rts            *ループに戻る
  3149.  
  3150. cmn_wave_form:            *波形メモリセット
  3151.     move.w    #ZM_SET_WAVE_FORM2,fnc_no-work(a6)
  3152.     bsr    get_cm_w
  3153.     move.w    d0,d1        *get wave no
  3154.     move.l    a2,a1        *wave data addr.
  3155.     bsr    set_wave_form2
  3156.     move.l    a0,a2
  3157.     rts
  3158.  
  3159. cmn_print:            *print
  3160.     * < a2.l=pointer
  3161.     pea    (a2)
  3162.     DOS    _PRINT
  3163.     addq.w    #4,sp
  3164.     bra    srch_fn_end
  3165.  
  3166. cmn_block_adpcm:
  3167.     move.w    #ZM_REGISTER_ZPD,fnc_no-work(a6)
  3168.     movea.l    a2,a1                    *ファイルネームポインタを渡してコール
  3169.     movem.l    d0-d7/a0-a5,-(sp)
  3170.     move.b    (a2),d1
  3171.     cmpi.b    #$20,d1
  3172.     bcs    cba_nofn                *$20未満はアドレス指定
  3173.     move.w    #ZM_REGISTER_ZPD,fnc_no-work(a6)
  3174.     move.l    sp,sp_buf-work(a6)            *使用するパラメータを設定
  3175.     move.l    #@f,fnc_quit_addr-work(a6)
  3176.     bsr    register_zpd
  3177. @@:
  3178.     movem.l    (sp)+,d0-d7/a0-a5
  3179.     bra    srch_fn_end
  3180. cba_nofn:            *<d1.l=zpd id
  3181.     addq.w    #1,a2        *skip 0
  3182.     bsr    get_cm_l    *get offset
  3183.     add.l    d0,a2
  3184.     move.w    #ZM_SET_ZPD_TABLE,fnc_no-work(a6)
  3185.     bsr    set_zpd_tbl_
  3186.     movem.l    (sp)+,d0-d7/a0-a5
  3187.     rts
  3188.  
  3189. cmn_read_sub_se:        *コンフィギュレーション読み込み(ZPD,CNF,MDD,MID,ZMSいずれも可)
  3190.     lea    exec_comn_cmd_se(pc),a5
  3191.     bra    @f
  3192. cmn_read_sub:            *コンフィギュレーション読み込み(ZPD,CNF,MDD,MID,ZMSいずれも可)
  3193.     lea    exec_comn_cmd(pc),a5
  3194. @@:
  3195.     move.w    #ZM_EXEC_SUBFILE,fnc_no-work(a6)
  3196.     tst.b    (a2)
  3197.     beq    @f
  3198.     lea    CNF-work(a6),a1    *拡張子
  3199. *    lea    cnf_last_fn(pc),a3
  3200.     bra    exec_subfile0
  3201. @@:
  3202.     addq.w    #1,a2        *skip 0
  3203.     bsr    get_cm_l    *get offset
  3204.     lea    (a2,d0.l),a1
  3205.     bsr    get_cm_l    *get size
  3206.     move.l    d0,d3
  3207.     bra    do_exec_subfile
  3208.  
  3209. cmn_midi_dump:                *バイナリMIDIデータ転送
  3210.     move.w    #ZM_TRANSMIT_MIDI_DUMP,fnc_no-work(a6)
  3211.     move.b    (a2)+,d1        *get I/F number
  3212.     ext.w    d1
  3213.     ext.l    d1
  3214.     tst.b    (a2)            *ファイルネームがあるか
  3215.     bne    transmit_midi_dump0    *ファイルを読み込んで転送
  3216.     addq.w    #1,a2        *skip 0
  3217.     bsr    get_cm_l    *get offset
  3218.     lea    (a2,d0.l),a1
  3219.     moveq.l    #0,d2
  3220.     bra    midi_transmission
  3221.  
  3222. get_cm_w:
  3223.     move.b    (a2)+,d0
  3224.     lsl.w    #8,d0
  3225.     move.b    (a2)+,d0
  3226.     rts
  3227.  
  3228. get_cm_l:
  3229.     move.b    (a2)+,d0
  3230.     lsl.w    #8,d0
  3231.     move.b    (a2)+,d0
  3232.     swap    d0
  3233.     move.b    (a2)+,d0
  3234.     lsl.w    #8,d0
  3235.     move.b    (a2)+,d0
  3236.     rts
  3237.  
  3238. se_adpcm1:            *ADPCMをSEモードで鳴らす    !v3
  3239.     *   cmd=$13
  3240.     * < a1.l=data address
  3241.     * < d1.hwhb=data type(-1:ADPCM,1:16bitPCM,2:8bitPCM)
  3242.     * < d1.hwlb=volume(0-127,64が標準)
  3243.     * < d1.lwhb=frq(0:3.9kHz 1:5.2kHz 2:7.8kHz 3:10.4kHz 4:15.6kHz)
  3244.     * < d1.lwlb=pan(0-3 / $80+0-127)
  3245.     * < d2.l=data size
  3246.     * < d4.lw=ch(0-15)
  3247.     * < d4.hw=se priority(0-255)
  3248.     ori.w    #$700,sr
  3249. sea1_patch:            *MPCM case(bra sea1_)
  3250.     swap    d4
  3251.     tst.b    se_mode-work(a6)
  3252.     beq    @f
  3253.     cmp.b    se_level(pc),d4
  3254.     bcc    @f
  3255.     rts
  3256. @@:
  3257.     move.b    d4,se_level-work(a6)
  3258.     st.b    se_mode-work(a6)
  3259.     jmp    adpcmout
  3260. sea1_:                *mpcmを用いて発音するケース
  3261.     move.w    #M_EFCT_OUT,d0
  3262.     move.b    d4,d0        *ch
  3263.     MPCM_call        *キーオン
  3264.     rts
  3265.  
  3266. se_adpcm2:            *ドライバー内のADPCM DATAをSEモードで鳴らす    !v3
  3267.     *   cmd=$14        *(エラーチェックはなし)
  3268.     * < d1.hwhb=data type(-1:ADPCM,1:16bitPCM,2:8bitPCM)
  3269.     * < d1.hwlb=volume(0-127,64が標準)
  3270.     * < d1.lwhb=frq(0:3.9kHz 1:5.2kHz 2:7.8kHz 3:10.4kHz 4:15.6kHz)
  3271.     * < d1.lwlb=pan(0-3 / $80+0-127)
  3272.     * < d2.l=PCM data number(d15が1ならば音色番号($8000+0-32767),
  3273.     *                  0ならばノート番号(0-32767)指定)
  3274.     * < d4.lw=ch(0-15)
  3275.     * < d4.hw=se priority(0-255)
  3276.     ori.w    #$700,sr
  3277.     bclr.l    #15,d2
  3278.     beq    @f
  3279.     tst.w    adpcm_n_max2-work(a6)
  3280.     beq    t_empty_timbre_number
  3281.     move.l    adpcm_tbl2-work(a6),a1
  3282.     bra    sea2_00
  3283. @@:
  3284.     tst.w    adpcm_n_max-work(a6)
  3285.     beq    t_empty_note_number
  3286.     move.l    adpcm_tbl-work(a6),a1
  3287. sea2_00:
  3288.     lsl.l    #adpcm_tbl_size_,d2    *adpcm_tbl_size倍
  3289.     lea    adt_size(a1,d2.l),a1    *skip attribute
  3290.     move.l    (a1),d2            *adt_size
  3291.     move.l    -(a1),a1        *adt_address
  3292. sea2_patch:                *MPCM case(bra sea2_)
  3293.     swap    d4
  3294.     tst.b    se_mode-work(a6)
  3295.     beq    @f
  3296.     cmp.b    se_level(pc),d4
  3297.     bcc    @f
  3298.     rts
  3299. @@:
  3300.     move.b    d4,se_level-work(a6)
  3301.     st.b    se_mode-work(a6)
  3302.     jmp    adpcmout
  3303. sea2_:
  3304.     move.w    #M_EFCT_OUT,d0
  3305.     move.b    d4,d0        *ch
  3306.     MPCM_call        *キーオン
  3307.     rts
  3308.  
  3309. intercept_play:
  3310.     *   cmd=$15
  3311.     * < d1.l=-1 interception mode
  3312.     * < d1.l=0  release interception & play
  3313.     * < d1.l=1  release interception
  3314.     * > none
  3315.     tst.l    d1
  3316.     bpl    @f
  3317.     patch_l2    BRA,m_play00,tmf_1
  3318.     bra    cache_flush
  3319. @@:
  3320.     move.l    m_play00_bak-work(a6),m_play00
  3321.     bsr    cache_flush
  3322.     tst.l    d1
  3323.     beq    m_play00
  3324.     rts
  3325. tmf_1:
  3326.     tas.b    timer_flg-work(a6)        *M_PLAYが実行されたマーク
  3327.     rts
  3328.  
  3329. current_midi_in:                *MIDIのカレント入力先
  3330.     *   cmd=$16
  3331.     * < d1.w=midi-in port number(0~3,-1:ask)
  3332.     * > d0.l=前回の設定(0-3,-1:err)
  3333.     * - a2保存
  3334.     * MIDI I/Fが無い時にはこのルーチンは無効となる
  3335.     ori.w    #$0700,sr
  3336.     moveq.l    #0,d0
  3337.     lea    current_midi_in_r+1(pc),a0
  3338.     move.b    (a0),d0                *戻り値(相対指定値)
  3339.     tst.w    d1                *問い合わせのみ
  3340.     bmi    @f
  3341.     cmp.w    d0,d1                *値が同じなら設定しない
  3342.     beq    @f
  3343.     move.b    d1,(a0)+            *絶対値書き込み
  3344.     moveq.l    #0,d2
  3345.     move.b    midi_if_tbl-current_midi_in_w(a0,d1.w),d2
  3346.     bmi    t_device_offline
  3347.     move.w    d2,(a0)                *current_midi_in_w
  3348.     bra    cache_flush
  3349. @@:
  3350.     rts
  3351.  
  3352. dummy_mdifret:                    *MIDI I/Fが一枚もない時の戻り値
  3353.     moveq.l    #-1,d0
  3354.     rts
  3355.  
  3356. current_midi_out:                *MIDIのカレント出力先
  3357.     *   cmd=$17
  3358.     * < d1.w=midi-out port number(0~3,-1:ask)
  3359.     * > d0.l=前回の設定(0-3,-1:ERR)
  3360.     * - a2.l保存
  3361.     * x a0
  3362.     * MIDI I/Fが無い時にはこのルーチンは無効となる
  3363.     move.w    sr,-(sp)
  3364.     ori.w    #$0700,sr
  3365.     moveq.l    #0,d0
  3366.     lea    current_midi_out_r+1(pc),a0
  3367.     move.b    (a0),d0                *戻り値(相対指定値)
  3368.     tst.w    d1                *問い合わせのみ
  3369.     bmi    @f
  3370.     cmp.w    #if_max-1,d1
  3371.     bhi    t_illegal_interface_number
  3372.     cmp.w    d0,d1                *値が同じなら設定しない
  3373.     beq    @f
  3374.     move.b    d1,(a0)+            *絶対値書き込み
  3375.     moveq.l    #0,d2
  3376.     move.b    midi_if_tbl-current_midi_out_w(a0,d1.w),d2
  3377.     bmi    t_device_offline
  3378.     move.w    d2,(a0)                *current_midi_out_w
  3379.     lea    eox_w-work(a6),a1
  3380.     tst.w    (a1,d2.w)            *ウェイトの有り無しチェック
  3381.     beq    1f
  3382.     move.w    _m_out1_j_tbl(pc,d2.w),_m_out+2-work(a6)
  3383.     bsr    cache_flush
  3384. @@:
  3385.     move.w    (sp)+,sr
  3386.     rts
  3387. 1:
  3388.     move.w    m_out1_j_tbl(pc,d2.w),_m_out+2-work(a6)
  3389.     bsr    cache_flush
  3390.     move.w    (sp)+,sr
  3391.     rts
  3392.  
  3393. _m_out1_j_tbl:
  3394.     dc.w    _m_out_m0-_m_out-2
  3395.     dc.w    _m_out_m1-_m_out-2
  3396.     dc.w    _m_out_r0-_m_out-2
  3397.     dc.w    _m_out_r1-_m_out-2
  3398.  
  3399. m_out1_j_tbl:
  3400.     dc.w    m_out_m0-_m_out-2
  3401.     dc.w    m_out_m1-_m_out-2
  3402.     dc.w    m_out_r0-_m_out-2
  3403.     dc.w    m_out_r1-_m_out-2
  3404.  
  3405. get_m_out_addr:        *インターフェース番号に対応した転送サブルーチンアドレスをかえす
  3406.             *nmdb!!(bra dummy_trans)
  3407.     * < d1.w=interface number(0-3,-1)
  3408.     * > a5.l=midi trans addr
  3409.     * x d0
  3410.     * - d1
  3411.     tst.w    d1
  3412.     bpl    @f
  3413.     lea    _m_out-work(a6),a5
  3414.     rts
  3415. @@:
  3416.     cmpi.w    #if_max-1,d1
  3417.     bhi    t_illegal_interface_number
  3418.     lea    midi_if_tbl(pc),a0
  3419.     moveq.l    #0,d0
  3420.     move.b    (a0,d1.w),d0
  3421.     bmi    dummy_trans
  3422.     lea    eox_w-work(a6),a5
  3423.     tst.w    (a5,d0.w)            *ウェイトの有無で割り込み送信か否かを判断
  3424.     beq    @f
  3425.     move.w    _gmoa_j_tbl(pc,d0.w),d0
  3426.     lea    gmoa_j_tbl(pc,d0.l),a5
  3427.     rts
  3428. @@:
  3429.     move.w    gmoa_j_tbl(pc,d0.w),d0
  3430.     lea    gmoa_j_tbl(pc,d0.l),a5
  3431.     rts
  3432. dummy_trans:
  3433.     lea    @f(pc),a5
  3434. @@:
  3435.     rts
  3436.  
  3437. gmoa_j_tbl:
  3438.     dc.w    m_out_m0-gmoa_j_tbl
  3439.     dc.w    m_out_m1-gmoa_j_tbl
  3440.     dc.w    m_out_r0-gmoa_j_tbl
  3441.     dc.w    m_out_r1-gmoa_j_tbl
  3442.  
  3443. _gmoa_j_tbl:
  3444.     dc.w    _m_out_m0-gmoa_j_tbl
  3445.     dc.w    _m_out_m1-gmoa_j_tbl
  3446.     dc.w    _m_out_r0-gmoa_j_tbl
  3447.     dc.w    _m_out_r1-gmoa_j_tbl
  3448.  
  3449. midi_transmission:            *MIDI生データの転送
  3450.     *   cmd=$18
  3451.     * < d1.l:midi-out port number(0-3,-1:current)
  3452.     * < d2.l:mode (size)
  3453.     *    =0 ASCII mode (end code:$1a)
  3454.     *    ≠0 BIN mode (data size)
  3455.     * < a1.l=data address
  3456.     * > d0.l=sum
  3457.     * - all
  3458. nmdb7:                *nmdb!!(patched to be RTS)
  3459. reglist    reg    d1-d5/d7/a1-a2/a4-a5
  3460.     movem.l    reglist,-(sp)
  3461.     bsr    get_m_out_addr
  3462.     tst.l    d2        *check size
  3463.     bne    bin_trns_md
  3464.     moveq.l    #0,d3        *init sum
  3465. mtrs_lp01:
  3466.     move.b    (a1)+,d0
  3467.     cmpi.b    #$1a,d0
  3468.     beq    exit_mdtr
  3469.     cmpi.b    #'.',d0
  3470.     bls    mtrs_lp01    *セパレータスキップ
  3471.     cmpi.b    #'/',d0
  3472.     beq    skip_cmnt
  3473.     cmpi.b    #'*',d0
  3474.     beq    skip_cmnt
  3475.     bsr    mk_capital
  3476.     move.b    d0,d1
  3477.     sub.b    #'0',d1
  3478.     cmpi.b    #9,d1
  3479.     bls    @f
  3480.     subq.b    #7,d1
  3481. @@:
  3482.     move.b    (a1)+,d0
  3483.     bsr    mk_capital
  3484.     sub.b    #'0',d0
  3485.     cmpi.b    #9,d0
  3486.     bls    @f
  3487.     subq.b    #7,d0
  3488. @@:
  3489.     lsl.b    #4,d1
  3490.     or.b    d1,d0
  3491.     add.b    d0,d3
  3492.     jsr    (a5)        *do trans
  3493.     bra    mtrs_lp01
  3494. skip_cmnt:            *改行までスキップ
  3495.     move.b    (a1)+,d0
  3496.     cmpi.b    #" ",d0
  3497.     bcc    skip_cmnt
  3498.     cmpi.b    #09,d0
  3499.     beq    skip_cmnt    *skip tab
  3500.     bra    mtrs_lp01
  3501.  
  3502. bin_trns_md:            *BINARY DATAの送信
  3503.     * < d2.l=size
  3504.     * < a1.l=data address
  3505.     * < a5.l=midi trans addr
  3506.     cmpi.l    #SMFHED,(a1)        *'MThd'
  3507.     beq    trans_smf_dat
  3508.     bsr    trans_midi_dat
  3509. exit_mdtr:
  3510.     move.l    d3,d0
  3511.     movem.l    (sp)+,reglist
  3512.     rts
  3513.  
  3514. trans_midi_dat:            *BINARY DATAの送信
  3515.     * < d2.l=size
  3516.     * < a1.l=data address
  3517.     * < a5.l=midi trans addr
  3518.     * > d3.b=sum
  3519.     * > d2.l=0,a1=next
  3520.     * d0,d2,d3
  3521.     moveq.l    #0,d3
  3522. @@:
  3523.     move.b    (a1)+,d0
  3524.     add.b    d0,d3
  3525.     jsr    (a5)        *do trans
  3526.     subq.l    #1,d2
  3527.     bne    @b
  3528.     rts
  3529.  
  3530. stop_smf:
  3531.     tst.b    smf_end_flag-work(a6)
  3532.     ble    @f
  3533.     bsr    release_int_mode
  3534. @@:
  3535.     rts
  3536.  
  3537. trans_smf_dat:                *SMF転送
  3538.     cmpi.l    #$0000_0001,8(a1)        *フォーマット1か
  3539.     bne    t_unmanageable_data_sequence    *未対応
  3540.     move.w    sr,d7
  3541.     ori.w    #$0700,sr
  3542.     cmp.l    #int_dummy,sub_job_entry-work(a6)
  3543.     beq    use_int_mode0            *割り込みモードが使える
  3544.     tst.b    smf_end_flag-work(a6)
  3545.     bgt    use_int_mode1            *割り込みモードを使う
  3546.     bmi    t_device_already_occupied    *すでにデバイスは占有されています
  3547.  
  3548.     move.w    mst_clk(pc),-(sp)
  3549.     move.w    $0c(a1),d0
  3550.     bmi    t_unmanageable_data_sequence    *未対応
  3551.     lsl.w    #2,d0
  3552.     move.w    d0,mst_clk-work(a6)
  3553.     lea    22(a1),a2
  3554.     move.w    #120,tempo_value-work(a6)    *テンポ=120
  3555.     move.l    tempo_value(pc),-(sp)        *tempo_value,timer_value
  3556.     move.l    inc_zmint-work(a6),-(sp)
  3557.     patch_l    BSR,inc_zmint,smf_entry
  3558.     bsr    cache_flush
  3559.     st.b    smf_end_flag-work(a6)
  3560.     jsr    getval-work(a6)
  3561.     move.l    d0,smf_delta-work(a6)
  3562.     move.l    a2,smf_pointer-work(a6)
  3563.     move.l    #1,smf_running-work(a6)        *running count host
  3564.     move.l    a5,smf_transfer-work(a6)    *MIDI transfer
  3565.     bsr    calc_timer
  3566.     bsr    init_timer
  3567.     move.w    d7,sr
  3568. smfcheck_lp:
  3569.     bitsns    $0                *ESCを押せば終了
  3570.     btst.l    #1,d0
  3571.     bne    1f
  3572. @@:
  3573.     tst.b    smf_end_flag-work(a6)
  3574.     bne    smfcheck_lp
  3575. 1:
  3576.     bsr    init_kbuf
  3577.     ori.w    #$0700,sr
  3578.     move.l    (sp)+,inc_zmint-work(a6)
  3579.     move.l    (sp)+,tempo_value-work(a6)
  3580.     move.w    (sp)+,mst_clk-work(a6)
  3581.     clr.b    smf_end_flag-work(a6)
  3582.     bsr    cache_flush
  3583.     bsr    init_timer
  3584.     move.w    d7,sr
  3585.     movem.l    (sp)+,reglist
  3586.     t_dat_ok
  3587.  
  3588. init_kbuf:            *キーバッファクリア
  3589.     move.l    d0,-(sp)
  3590.     clr.w    -(sp)
  3591.     DOS    _KFLUSH
  3592.     addq.w    #2,sp
  3593.     move.l    (sp)+,d0
  3594.     rts
  3595.  
  3596. use_int_mode1:                    *割り込みモード
  3597.     bsr    release_int_mode
  3598. use_int_mode0:
  3599.     * < d2=data size
  3600.     move.l    #ID_SMF,d3
  3601.     bsr    get_mem
  3602.     tst.l    d0
  3603.     bmi    t_out_of_memory
  3604.     move.l    a0,smf_addr-work(a6)
  3605. @@:                        *コピー
  3606.     move.l    (a1)+,(a0)+
  3607.     subq.l    #4,d2
  3608.     bne    @b
  3609.     move.l    smf_addr(pc),a2
  3610.     move.w    $0c(a2),d1
  3611.     bmi    t_unmanageable_data_sequence    *未対応
  3612.     lsl.w    #2,d1                *全音符長に変換
  3613.     swap    d1
  3614.     move.l    d1,smf_mst_clk-work(a6)
  3615.     lea    22(a2),a2
  3616.     move.w    #120,d1                *defaultテンポ=120
  3617.     move.b    #1,smf_end_flag-work(a6)    *割り込みモードマーク
  3618.     jsr    getval-work(a6)            *初期デルタタイム
  3619.     move.l    d0,smf_delta-work(a6)
  3620.     move.l    a2,smf_pointer-work(a6)
  3621.     move.l    #1,smf_running-work(a6)        *running count host
  3622.     move.l    a5,smf_transfer-work(a6)    *MIDI transfer
  3623.     lea    smf_entry-work(a6),a1
  3624.     bsr    set_int_service
  3625.     move.w    d7,sr
  3626.     movem.l    (sp)+,reglist
  3627.     t_dat_ok
  3628.  
  3629. release_int_mode:                *割り込みモード中止/解除
  3630. reglist    reg    d0-d2/a0-a1
  3631.     movem.l    reglist,-(sp)
  3632.     moveq.l    #0,d1
  3633.     move.b    d1,smf_end_flag-work(a6)    *割り込みモードクリア
  3634.     lea    smf_entry-work(a6),a1
  3635.     bsr    set_int_service            *解除
  3636.     move.l    smf_addr(pc),a1
  3637.     bsr    free_mem
  3638.     movem.l    (sp)+,reglist
  3639.     rts
  3640.  
  3641. exclusive:
  3642.     *   cmd=$19
  3643.     * < a1.l=data address
  3644.     * < d1.l=midi-out port number(0-3,-1:current)
  3645.     * < d2.l=size
  3646.     * < d3.hw=MAKER ID
  3647.     * < d3.lw=id,model
  3648.     * > none
  3649.     bsr    get_m_out_addr
  3650.     lea    header(pc),a2
  3651.     move.l    d3,d5
  3652.     swap    d5        *d5.w=maker ID
  3653.     tst.l    d3        *メーカー指定なしのケース
  3654.     bmi    1f
  3655.     tst.b    d3
  3656.     bmi    @f
  3657.     move.b    d3,3(a2)    *set mdl
  3658. @@:
  3659.     lsr.w    #8,d3
  3660.     tst.b    d3
  3661.     bmi    @f
  3662.     move.b    d3,2(a2)    *set dev
  3663. @@:
  3664.     cmpi.b    #MKID_ROLAND,d5
  3665.     bne    1f
  3666.     moveq.l    #5-1,d1
  3667. @@:                *header転送
  3668.     move.b    (a2)+,d0
  3669.     jsr    (a5)
  3670.     dbra    d1,@b
  3671.     moveq.l    #0,d3        *checksum=0
  3672.     bra    2f
  3673. 1:
  3674.     moveq.l    #0,d3        *checksum=0
  3675.     moveq.l    #$f0,d0
  3676.     jsr    (a5)
  3677.     cmpi.b    #MKID_YAMAHA,d5
  3678.     bne    2f
  3679.     moveq.l    #MKID_YAMAHA,d0
  3680.     jsr    (a5)
  3681.     move.b    2(a2),d0    *mdl
  3682.     jsr    (a5)
  3683.     move.b    3(a2),d0    *dev
  3684.     jsr    (a5)
  3685.     move.l    d2,d1
  3686.     subq.l    #3,d1        *アドレス分引く
  3687.     move.w    d1,d0
  3688.     lsr.w    #7,d0
  3689.     andi.w    #$7f,d0
  3690.     add.b    d0,d3
  3691.     jsr    (a5)        *length MSB
  3692.     move.w    d1,d0
  3693.     andi.w    #$7f,d0
  3694.     add.b    d0,d3
  3695.     jsr    (a5)        *length LSB
  3696. 2:
  3697.     move.b    (a1)+,d0
  3698.     add.b    d0,d3
  3699.     jsr    (a5)
  3700.     subq.l    #1,d2
  3701.     bne    2b
  3702.     cmpi.b    #MKID_ROLAND,d5
  3703.     beq    @f
  3704.     cmpi.b    #MKID_YAMAHA,d5
  3705.     bne    1f
  3706. @@:
  3707.     andi.b    #$7f,d3
  3708.     moveq.l    #$80,d0
  3709.     sub.b    d3,d0
  3710.     andi.b    #$7f,d0
  3711.     jsr    (a5)
  3712. 1:
  3713.     moveq.l    #$f7,d0        *EOX
  3714.     jmp    (a5)
  3715.  
  3716. set_eox_wait:                *wait
  3717.     *   cmd=$1b
  3718.     * < d1.l=midi-out port number(0-3,-1:current)
  3719.     * < d2.w=wait parameter(0-65535)
  3720.     * > d0.w=last parameter(0-65535)
  3721.     * MIDI I/Fが無い時にはこのルーチンは無効となる
  3722.     ori.w    #$0700,sr
  3723.     lea    eox_w-work(a6),a2
  3724.     tst.w    d2
  3725.     bne    case_ew
  3726.                     *eox_wait無しの場合
  3727.     tst.w    d1
  3728.     bpl    1f
  3729.                     *カレントの場合
  3730.     move.w    current_midi_out_w(pc),d1    *d1.w=0,2,4,6
  3731.     move.w    @f(pc,d1.w),_m_out+2-work(a6)
  3732.     moveq.l    #0,d0
  3733.     move.w    (a2,d1.w),d0        *d0.w=previous
  3734.     move.w    d2,(a2,d1.w)
  3735.     bra    cache_flush
  3736. 1:                    *明示指定の場合
  3737.     cmpi.w    #if_max-1,d1
  3738.     bhi    t_illegal_interface_number
  3739.     lea    midi_if_tbl(pc),a1
  3740.     moveq.l    #0,d0
  3741.     move.b    (a1,d1.w),d0
  3742.     bmi    t_device_offline
  3743.     cmp.w    current_midi_out_w(pc),d0
  3744.     bne    1f
  3745.     move.w    @f(pc,d0.w),_m_out+2-work(a6)
  3746. 1:
  3747.     move.w    (a2,d0.w),d1
  3748.     move.w    d2,(a2,d0.w)
  3749.     move.w    d1,d0
  3750.     bra    cache_flush
  3751. @@:
  3752.     dc.w    m_out_m0-_m_out-2
  3753.     dc.w    m_out_m1-_m_out-2
  3754.     dc.w    m_out_r0-_m_out-2
  3755.     dc.w    m_out_r1-_m_out-2
  3756. case_ew:                *eox_wait有りの場合
  3757.     tst.w    d1
  3758.     bpl    1f
  3759.                     *カレントの場合
  3760.     move.w    current_midi_out_w(pc),d1    *d1.w=0,2,4,6
  3761.     move.w    @f(pc,d1.w),_m_out+2-work(a6)
  3762.     moveq.l    #0,d0
  3763.     move.w    (a2,d1.w),d0        *d0.w=previous
  3764.     move.w    d2,(a2,d1.w)
  3765.     bra    cache_flush
  3766. 1:
  3767.     cmpi.w    #if_max-1,d1
  3768.     bhi    t_illegal_interface_number
  3769.     lea    midi_if_tbl(pc),a1
  3770.     moveq.l    #0,d0
  3771.     move.b    (a1,d1.w),d0
  3772.     bmi    t_device_offline
  3773.     cmp.w    current_midi_out_w(pc),d0
  3774.     bne    1f
  3775.     move.w    @f(pc,d0.w),_m_out+2-work(a6)
  3776. 1:
  3777.     move.w    (a2,d0.w),d1        *d0.w=previous
  3778.     move.w    d2,(a2,d0.w)
  3779.     move.w    d1,d0
  3780.     bra    cache_flush
  3781. @@:
  3782.     dc.w    _m_out_m0-_m_out-2
  3783.     dc.w    _m_out_m1-_m_out-2
  3784.     dc.w    _m_out_r0-_m_out-2
  3785.     dc.w    _m_out_r1-_m_out-2
  3786.  
  3787. midi_inp1:                *nmdb!!(patched to be RTS)
  3788.     *   cmd=$1c
  3789.     * < d1.w=midi-out port number(0-3,-1:current)
  3790.     * < d2.l=0 single mode
  3791.     * < d2.l<>0 loop mode        *読み出せるまで待ちつづける
  3792.     * > d0.b=recieved data
  3793.     * > d0.w=minus:dataなし
  3794.     * > d0.l=minus:読みこぼしあり
  3795.     * > a0.l=前回の読みだしからの経過クロック数
  3796.     * - d1
  3797.     tst.w    d1            *minusならcurrent使用
  3798.     bpl    @f
  3799.     move.w    current_midi_in_w(pc),d0
  3800.     move.w    mi1_j_tbl(pc,d0.w),d0
  3801.     jmp    mi1_j_tbl(pc,d0.w)
  3802. @@:
  3803.     cmpi.w    #if_max-1,d1
  3804.     bhi    t_illegal_interface_number
  3805.     lea    midi_if_tbl(pc),a1
  3806.     moveq.l    #0,d0
  3807.     move.b    (a1,d1.w),d0
  3808.     bmi    t_device_offline
  3809.     move.w    mi1_j_tbl(pc,d0.w),d0
  3810.     jmp    mi1_j_tbl(pc,d0.w)
  3811. mi1_j_tbl:
  3812.     dc.w    mi1_m0-mi1_j_tbl
  3813.     dc.w    mi1_m1-mi1_j_tbl
  3814.     dc.w    mi1_r-mi1_j_tbl
  3815.     dc.w    mi1_r-mi1_j_tbl
  3816.  
  3817. mi1_m0:                *CZ6BM1 #1
  3818.     move.l    rec_buffer_0-work(a6),a1
  3819. mi10:
  3820.     moveq.l    #0,d0
  3821.     move.w    rec_buf_err(a1),d0    *最上位にバッファ溢れフラグを持ってくる
  3822.     swap    d0
  3823.     tst.l    d2
  3824.     bne    loop_inp_m0        *ループモードへ
  3825.     tst.b    rec_buf_stat(a1)    *データあるか
  3826.     beq    exit_mi1
  3827. get_data_mi:
  3828.     move.l    last_zmusic_int(pc),d1
  3829.     move.l    zmusic_int(pc),a0
  3830.     move.l    a0,last_zmusic_int-work(a6)
  3831.     sub.l    d1,a0            *a0.l=前回からの経過クロック
  3832.     move.w    rec_read_ptr(a1),d1
  3833.     move.b    rec_buffer(a1,d1.w),d0
  3834.     addq.w    #1,d1
  3835.     andi.w    #recbufsize-1,d1
  3836.     move.w    d1,rec_read_ptr(a1)
  3837.     cmp.w    rec_write_ptr(a1),d1
  3838.     sne.b    rec_buf_stat(a1)
  3839.     rts
  3840. exit_mi1:                *データなし
  3841.     move.w    #-1,d0
  3842.     rts
  3843.  
  3844. loop_inp_m0:
  3845.     tst.b    rec_buf_stat(a1)    *データあるか
  3846.     bne    get_data_mi
  3847.     jsr    h_wait-work(a6)
  3848.     subq.l    #1,d2
  3849.     bne    loop_inp_m0
  3850.     move.w    #-1,d0
  3851.     rts
  3852.  
  3853. mi1_m1:                *CZ6BM1 #2
  3854.     move.l    rec_buffer_1(pc),a1
  3855.     bra    mi10
  3856.  
  3857. mi1_r:                *RS232C
  3858.     move.l    rec_buffer_r(pc),a1
  3859.     bra    mi10
  3860.  
  3861. midi_out1:            *nmdb!!(patched to be RTS)
  3862.     *   cmd=$1d
  3863.     * < d1.w=midi-out port number(0-3,-1:current)
  3864.     * < d2.b=midi data
  3865.     * > d0.l=error code
  3866.     move.b    d2,d0
  3867.     moveq.l    #0,d2
  3868.     tst.w    d1            *minusならcurrent使用
  3869.     bpl    @f
  3870.     move.w    current_midi_in_w(pc),d2
  3871.     move.w    mo1_j_tbl(pc,d2.w),d2
  3872.     jmp    mo1_j_tbl(pc,d2.l)
  3873. @@:
  3874.     cmpi.w    #if_max-1,d1
  3875.     bhi    t_illegal_interface_number
  3876.     lea    midi_if_tbl(pc),a0
  3877.     move.b    (a0,d1.w),d2
  3878.     bmi    t_device_offline
  3879.     move.w    mo1_j_tbl(pc,d2.w),d2
  3880.     jmp    mo1_j_tbl(pc,d2.l)
  3881. mo1_j_tbl:
  3882.     dc.w    m_out_m0-mo1_j_tbl
  3883.     dc.w    m_out_m1-mo1_j_tbl
  3884.     dc.w    m_out_r0-mo1_j_tbl
  3885.     dc.w    m_out_r1-mo1_j_tbl
  3886.  
  3887. midi_rec:            *MIDI生データの受信開始
  3888.     *   cmd=$1e
  3889.     * < d1.w=I/F number(0-3,-1:current)
  3890. nmdb5:                *nmdb!!
  3891.     ori.w    #$0700,sr
  3892.     tst.w    d1            *minusならcurrent使用
  3893.     bpl    @f
  3894.     move.w    current_midi_in_w(pc),d0
  3895.     move.w    m_in_s_tbl(pc,d0.w),d0
  3896.     jmp    m_in_s_tbl(pc,d0.w)
  3897. @@:
  3898.     cmpi.w    #if_max-1,d1
  3899.     bhi    t_illegal_interface_number
  3900.     moveq.l    #0,d0
  3901.     lea    midi_if_tbl(pc),a0
  3902.     move.b    (a0,d1.w),d0
  3903.     bmi    t_device_offline
  3904.     move.w    m_in_s_tbl(pc,d0.w),d0
  3905.     jmp    m_in_s_tbl(pc,d0.w)
  3906. m_in_s_tbl:
  3907.     dc.w    m_in_s_m0-m_in_s_tbl
  3908.     dc.w    m_in_s_m1-m_in_s_tbl
  3909.     dc.w    m_in_s_r-m_in_s_tbl
  3910.     dc.w    m_in_s_r-m_in_s_tbl
  3911.  
  3912. m_in_s_m0:
  3913.     move.l    rec_buffer_0(pc),a1
  3914.     clr.l    rec_write_ptr(a1)    *rec_write_ptr,rec_read_ptr
  3915.     clr.w    rec_buf_err(a1)        *rec_buf_err,rec_buf_stat
  3916.     lea    rgr,a0
  3917.     lea    r06_0(pc),a1
  3918. mis0:
  3919.     move.b    #3,(a0)
  3920.                     midiwait
  3921.     move.b    #%1001_0001,grp5-rgr(a0)    *buffer clear,MCF on,RecEn
  3922.                     midiwait
  3923.     clr.b    (a0)
  3924.                     midiwait
  3925.     ori.b    #$20,(a1)        *割り込みオン
  3926.     move.b    (a1),grp6-rgr(a0)
  3927.                     midiwait
  3928.     t_dat_ok
  3929.  
  3930. m_in_s_m1:
  3931.     move.l    rec_buffer_1(pc),a1
  3932.     clr.l    rec_write_ptr(a1)    *rec_write_ptr,rec_read_ptr
  3933.     clr.w    rec_buf_err(a1)        *rec_buf_err,rec_buf_stat
  3934.     lea    rgr+$10,a0
  3935.     lea    r06_1(pc),a1
  3936.     bra    mis0
  3937.  
  3938. m_in_s_r:
  3939.     move.l    rec_buffer_r(pc),a1
  3940.     clr.l    rec_write_ptr(a1)    *rec_write_ptr,rec_read_ptr
  3941.     clr.w    rec_buf_err(a1)        *rec_buf_err,rec_buf_stat
  3942.     lea    scc_a,a0
  3943.     tst.b    (a0)
  3944.     move.b    #$01,(a0)
  3945.     move.b    wr1(pc),d0
  3946.     andi.b    #%1110_0111,d0
  3947.     ori.b    #%0001_0000,d0
  3948.     move.b    d0,wr1-work(a6)
  3949.     move.b    d0,(a0)
  3950.     t_dat_ok
  3951. m_in_s_no:                *MIDIインターフェースなし
  3952. m_in_e_no:                *MIDIインターフェースなし
  3953.     moveq.l    #-1,d0
  3954.     rts
  3955.  
  3956. midi_rec_end:                *MIDI生データ受信終了
  3957.     *   cmd=$1f
  3958.     * < d1.w=I/F number (0-3,-1:current)
  3959.     * > d0.l=error code
  3960.     ori.w    #$0700,sr
  3961.     tst.w    d1
  3962.     bpl    @f
  3963.     move.w    current_midi_in_w(pc),d0
  3964.     move.w    m_in_e_tbl(pc,d0.w),d0
  3965.     jmp    m_in_e_tbl(pc,d0.w)
  3966. @@:
  3967.     cmpi.w    #if_max-1,d1
  3968.     bhi    t_illegal_interface_number
  3969.     moveq.l    #0,d0
  3970.     lea    midi_if_tbl(pc),a0
  3971.     move.b    (a0,d1.w),d0
  3972.     bmi    t_device_offline
  3973.     move.w    m_in_e_tbl(pc,d0.w),d0
  3974.     jmp    m_in_e_tbl(pc,d0.w)
  3975. m_in_e_tbl:
  3976.     dc.w    m_in_e_m0-m_in_e_tbl
  3977.     dc.w    m_in_e_m1-m_in_e_tbl
  3978.     dc.w    m_in_e_r-m_in_e_tbl
  3979.     dc.w    m_in_e_r-m_in_e_tbl
  3980.  
  3981. m_in_e_m0:
  3982.     lea    rgr,a0
  3983.     lea    r06_0(pc),a1
  3984. mie0:
  3985.     clr.b    (a0)
  3986.                     midiwait
  3987.     andi.b    #%1101_1111,(a1)
  3988.     move.b    (a1),grp6-rgr(a0)    *int end
  3989.                     midiwait
  3990.     t_dat_ok
  3991.  
  3992. m_in_e_m1:
  3993.     lea    rgr+$10,a1
  3994.     lea    r06_1(pc),a1
  3995.     bra    mie0
  3996.  
  3997. m_in_e_r:
  3998.     lea    scc_a,a0        *int end (記録強制終了)
  3999.     tst.b    (a0)
  4000.     move.b    #$01,(a0)
  4001.     andi.b    #%1110_0111,wr1-work(a6)
  4002.     move.b    wr1(pc),(a0)
  4003.     t_dat_ok
  4004.  
  4005. send_header:
  4006.     * - all
  4007.     movem.l    d2/a1,-(sp)
  4008.     lea    header(pc),a1
  4009.     moveq.l    #8-1,d2
  4010. @@:
  4011.     move.b    (a1)+,d0
  4012.     jsr    (a5)
  4013.     dbra    d2,@b
  4014.     movem.l    (sp)+,d2/a1
  4015.     rts
  4016.  
  4017. gs_reset:                *GSの初期化!v3
  4018.     *   cmd=$20
  4019.     * < d1.w=midi-out port number(0-3,-1:current)
  4020.     * < d3.b=gs id number(0-127,-1:current)
  4021.     * > d0.l=error code
  4022.     bsr    get_m_out_addr
  4023.     bsr    getset_gs_id            *ID保存/取得
  4024.     lea    header(pc),a1
  4025.     moveq.l    #11,d2
  4026.     move.b    d3,2(a1)
  4027.     move.b    #$42,3(a1)
  4028.     move.b    #$40,5(a1)
  4029.     move.l    #$007f0041,6(a1)
  4030.     bsr    trans_midi_dat
  4031.     t_dat_ok
  4032.  
  4033. getset_m1_id:
  4034.     lea    m1_id(pc),a4
  4035.     bra    @f
  4036.  
  4037. getset_mt32_id:
  4038.     lea    mt32_id(pc),a4
  4039.     bra    @f
  4040.  
  4041. getset_u220_id:
  4042.     lea    u220_id(pc),a4
  4043.     bra    @f
  4044.  
  4045. getset_sc88_id:
  4046.     lea    sc88_id(pc),a4
  4047.     bra    @f
  4048.  
  4049. getset_gs_id:
  4050.     * < d1.w=midi-out port number(0-3,-1:current)
  4051.     * < d3.b=ID
  4052.     * x d0,a4
  4053.     lea    gs_id(pc),a4
  4054. @@:
  4055.     tst.w    d1
  4056.     bpl    @f
  4057.     move.w    current_midi_out_w(pc),d0
  4058.     bra    1f
  4059. @@:
  4060.     move.l    a0,-(sp)
  4061.     lea    midi_if_tbl(pc),a0
  4062.     moveq.l    #0,d0
  4063.     move.b    (a0,d1.w),d0
  4064.     move.l    (sp)+,a0
  4065. 1:
  4066.     lsr.w    #1,d0            */2
  4067.     tst.b    d3
  4068.     bpl    @f
  4069.     move.b    (a4,d0.w),d3        *DEFAULTを使う
  4070.     rts
  4071. @@:
  4072.     move.b    d3,(a4,d0.w)
  4073.     rts
  4074.  
  4075. gs_partial_reserve:                *GSのパーシャルリザーブを設定!v3
  4076.     *   cmd=$21
  4077.     * < d1.w=midi-out port number(0-3,-1:current)
  4078.     * < a1.l=data address
  4079.     * < d3.b=gs id number(0-127,-1:current)
  4080.     * > d0.l=error code
  4081.     bsr    get_m_out_addr
  4082.     bsr    getset_gs_id            *ID保存/取得
  4083.     lea    header+2(pc),a2
  4084.     move.b    d3,(a2)+        *set dev ID
  4085.     move.b    #$42,(a2)+        *set model id
  4086.     addq.w    #1,a2
  4087.     move.b    #$40,(a2)+        *set addr H
  4088.     move.w    #$0110,(a2)+        *set addr L
  4089.     bsr    send_header
  4090.     move.l    v_buffer(pc),a0
  4091.     move.b    9(a1),(a0)+    *copy part 10
  4092.     moveq.l    #9-1,d0
  4093. @@:
  4094.     move.b    (a1)+,(a0)+    *copy part 1 to 9
  4095.     dbra    d0,@b
  4096.     addq.w    #1,a1        *skip part 10
  4097.     moveq.l    #6-1,d0
  4098. @@:
  4099.     move.b    (a1)+,(a0)+    *copy part 11 to 16
  4100.     dbra    d0,@b
  4101.     moveq.l    #16,d2
  4102.     move.l    v_buffer(pc),a1
  4103.     bsr    trans_midi_dat    *data 本体を転送(> d3.b=sum)
  4104.     add.b    $40+$01+$10,d3
  4105.     moveq.l    #$80,d0
  4106.     andi.b    #$7f,d3
  4107.     sub.b    d3,d0
  4108.     andi.b    #$7f,d0
  4109.     jsr    (a5)
  4110.     moveq.l    #$f7,d0
  4111.     jsr    (a5)
  4112.     t_dat_ok
  4113.  
  4114. gs_reverb:                *GSのリバーブパラメータ設定
  4115.     *   cmd=$22
  4116.     * < d1.w=midi-out port number(0-3,-1:current)
  4117.     * < a1.l=data address
  4118.     * < d2.l=size
  4119.     * < d3.b=gs id number(0-127,-1:current)
  4120.     * > d0.l=error code
  4121.     bsr    get_m_out_addr
  4122.     tst.l    d2
  4123.     beq    t_illegal_data_size
  4124.     cmpi.l    #7,d2
  4125.     bhi    t_illegal_data_size
  4126.     bsr    getset_gs_id            *ID保存/取得
  4127.     lea    header+2(pc),a2
  4128.     move.b    d3,(a2)+        *set dev ID
  4129.     move.b    #$42,(a2)+        *set model id
  4130.     addq.w    #1,a2
  4131.     move.b    #$40,(a2)+
  4132.     move.w    #$0130,(a2)+
  4133.     bsr    send_header
  4134.     bsr    trans_midi_dat        *> d3.b=sum
  4135.     add.b    #$40+$01+$30,d3
  4136.     andi.b    #$7f,d3
  4137.     moveq.l    #$80,d0
  4138.     sub.b    d3,d0
  4139.     andi.b    #$7f,d0
  4140.     jsr    (a5)
  4141.     moveq.l    #$f7,d0
  4142.     jsr    (a5)
  4143.     t_dat_ok
  4144.  
  4145. gs_chorus:            *gsのコーラスパラメータ設定
  4146.     *   cmd=$23
  4147.     * < d1.w=midi-out port number(0-3,-1:current)
  4148.     * < a1.l=data address
  4149.     * < d2.l=size
  4150.     * < d3.b=gs id number(0-127,-1:current)
  4151.     * > d0.l=error code
  4152.     bsr    get_m_out_addr
  4153.     tst.l    d2
  4154.     beq    t_illegal_data_size
  4155.     cmpi.l    #8,d2
  4156.     bhi    t_illegal_data_size
  4157.     bsr    getset_gs_id            *ID保存/取得
  4158.     lea    header+2(pc),a2
  4159.     move.b    d3,(a2)+            *set dev ID
  4160.     move.b    #$42,(a2)+            *set model id
  4161.     addq.w    #1,a2
  4162.     move.b    #$40,(a2)+
  4163.     move.w    #$0138,(a2)+
  4164.     bsr    send_header
  4165.     bsr    trans_midi_dat            *> d3.b=sum
  4166.     add.b    #$40+$01+$38,d3
  4167.     andi.b    #$7f,d3
  4168.     moveq.l    #$80,d0
  4169.     sub.b    d3,d0
  4170.     andi.b    #$7f,d0
  4171.     jsr    (a5)
  4172.     moveq.l    #$f7,d0
  4173.     jsr    (a5)
  4174.     t_dat_ok
  4175.  
  4176. gs_part_setup:                *gsのパートパラメータ設定
  4177.     *   cmd=$24
  4178.     * < a1.l=data address
  4179.     * < d1.w=midi-out port number(0-3,-1:current)
  4180.     * < d2.l=size(1~119)
  4181.     * < d3.hw=gs part number
  4182.     * < d3.lw=gs id number(0-127,-1:current)
  4183.     * > d0.l=error code
  4184.     bsr    get_m_out_addr
  4185.     subq.w    #1,d2            *for dbra
  4186.     bmi    t_illegal_data_size
  4187.     cmp.l    #119-1,d2
  4188.     bhi    t_illegal_data_size
  4189.     bsr    getset_gs_id        *ID保存/取得
  4190.     lea    header+2(pc),a2
  4191.     move.b    d3,(a2)+        *set dev ID
  4192.     move.b    #$42,(a2)+        *set model id
  4193.     move.l    #$401002,d4        *inst address
  4194.     swap    d3
  4195.     cmpi.w    #16,d3
  4196.     bhi    t_illegal_part_number
  4197.     cmpi.b    #10,d3
  4198.     bcs    @f            *9以下はそのまま
  4199.     bhi    dec_ptn
  4200.     moveq.l    #0,d3            *10はd3=0
  4201.     bra    @f
  4202. dec_ptn:
  4203.     subq.b    #1,d3            *10以上はd3=d3-1
  4204. @@:
  4205.     lsl.w    #8,d3
  4206.     or.w    d3,d4            *d4.l=partナンバーに対応したアドレス値
  4207.     move.b    (a1),d0            *保存
  4208.     movem.l    d0/a1,-(sp)        *先頭データ保存
  4209.     subq.b    #1,d0            *MIDI CH(1~16)->内部コード($00~$0f)
  4210.     cmpi.b    #$0f,d0
  4211.     bls    @f
  4212.     moveq.l    #$10,d0            *範囲外はOFFとみなす
  4213. @@:
  4214.     move.b    d0,(a1)
  4215.  
  4216.     move.l    d4,d5
  4217.     move.l    a1,a3
  4218.     moveq.l    #0,d1
  4219.     moveq.l    #0,d3
  4220.     lea    gsptofs(pc),a2
  4221. gsptlp:
  4222.     add.b    (a1)+,d1
  4223.     addq.l    #1,d3
  4224.     addq.b    #1,d4        *どうせ上位は変化しないから
  4225.     move.w    d4,d0
  4226.     andi.w    #$f0ff,d0
  4227.     cmp.w    (a2),d0
  4228.     bne    @f
  4229.     bsr    send_gsptdt
  4230.     move.l    (a2)+,d0
  4231.     add.w    d0,d4
  4232.     move.l    d4,d5
  4233.     move.l    a1,a3
  4234.     moveq.l    #0,d1
  4235.     moveq.l    #0,d3
  4236. @@:
  4237.     dbra    d2,gsptlp
  4238.     tst.l    d3
  4239.     beq    @f
  4240.     bsr    send_gsptdt
  4241. @@:
  4242.     movem.l    (sp)+,d0/a1
  4243.     move.b    d0,(a1)        *書き換えた値をもとに戻す
  4244.     t_dat_ok
  4245.  
  4246. send_gsptdt:
  4247.     * < a3.l=data address
  4248.     * < d1.b=sum
  4249.     * < d5.l=address
  4250.     * < d3.l=count
  4251.     movem.l    d2/d4/a1-a2,-(sp)
  4252.     lea    exc_addr(pc),a1
  4253.     swap    d5
  4254.     move.b    d5,(a1)+
  4255.     swap    d5
  4256.     move.w    d5,(a1)+
  4257.     add.b    -(a1),d1
  4258.     add.b    -(a1),d1
  4259.     add.b    -(a1),d1
  4260.     move.w    d1,-(sp)
  4261.     move.l    d3,-(sp)
  4262.     bsr    send_header
  4263.     move.l    a3,a1
  4264.     move.l    (sp)+,d2
  4265.     bsr    trans_midi_dat    * > d3=sum
  4266.     moveq.l    #$80,d0
  4267.     move.w    (sp)+,d2
  4268.     andi.b    #$7f,d2
  4269.     sub.b    d2,d0
  4270.     andi.b    #$7f,d0
  4271.     jsr    (a5)
  4272.     moveq.l    #$f7,d0
  4273.     jsr    (a5)
  4274.     movem.l    (sp)+,d2/d4/a1-a2
  4275.     rts
  4276.  
  4277. gsptofs:
  4278. *    dc.w    $1017,$0000
  4279.     dc.w    $1019,$0000
  4280.     dc.w    $1023,$000d
  4281.     dc.w    $1038,$0008
  4282.     dc.w    $104c,$0fb4
  4283.     dc.w    $200b,$0005
  4284.     dc.w    $201b,$0005
  4285.     dc.w    $202b,$0005
  4286.     dc.w    $203b,$0005
  4287.     dc.w    $204b,$0005
  4288.     dc.w    -1
  4289.  
  4290. gs_drum_setup:                *SC55のドラムパラメータ設定    !v3
  4291.     *   cmd=$25
  4292.     * < a1.l=data address
  4293.     * < d1.w=midi-out port number(0-3,-1:current)
  4294.     * < d2.l=size
  4295.     * < d3.hw=gs map number*256+note number
  4296.     * < d3.lw=gs id number(0-127,-1:current)
  4297.     * > d0.l=error code
  4298.     bsr    get_m_out_addr
  4299.     subq.w    #1,d2            *for dbra
  4300.     bmi    t_illegal_data_size
  4301.     cmpi.l    #8-1,d2
  4302.     bhi    t_illegal_data_size
  4303.     bsr    getset_gs_id        *ID保存/取得
  4304.     lea    header+2(pc),a2
  4305.     move.b    d3,(a2)+        *set dev ID
  4306.     move.b    #$42,(a2)+        *set model id
  4307.     move.l    #$410100,d4        *inst address
  4308.     swap    d3
  4309.     cmpi.b    #127,d3
  4310.     bhi    t_illegal_note_number
  4311.     move.b    d3,d4            *note set
  4312.     lsl.w    #4,d3
  4313.     andi.w    #$f000,d3
  4314.     or.w    d3,d4            *make address
  4315. gsdrm_set_lp:
  4316.     bsr    sc_p_set
  4317.     add.w    #$0100,d4
  4318.     addq.w    #1,a1
  4319.     dbra    d2,gsdrm_set_lp
  4320.     t_dat_ok
  4321.  
  4322. sc_p_set:                *gsフォーマット:1パラメータ書き込み
  4323.     * < d4=instrument address    *(dev ID,model IDは先に
  4324.     * < a1.l=data address        *header+2,+3へ設定しておくこと)
  4325.     * < d2.l=data size
  4326.     * - all
  4327.     movem.l    d0-d2/d4/a0-a2,-(sp)
  4328.     lea    exc_addr(pc),a0
  4329.     move.b    (a1),sc_p_data-exc_addr(a0)    *1バイトデータセット
  4330.  
  4331.     swap    d4
  4332.     move.b    d4,(a0)+        *set addr H
  4333.     swap    d4
  4334.     move.w    d4,(a0)+        *set addr L
  4335.  
  4336.     move.b    -(a0),d1        *アドレス加算(for make check sum)
  4337.     add.b    -(a0),d1
  4338.     add.b    -(a0),d1
  4339.     add.b    (a1),d1            *data加算
  4340.     moveq.l    #$80,d0
  4341.     andi.b    #$7f,d1
  4342.     sub.b    d1,d0
  4343.     lea    header(pc),a1
  4344.     move.b    d0,tail-header(a1)    *save ROLAND check sum
  4345.     moveq.l    #11,d2
  4346.     bsr    trans_midi_dat        *尻尾を転送
  4347.     movem.l    (sp)+,d0-d2/d4/a0-a2
  4348.     rts
  4349.  
  4350. gs_drum_name:
  4351.     *   cmd=$26
  4352.     * < a1.l=data address
  4353.     * < d1.w=midi-out port number(0-2,-1:current)
  4354.     * < d2.l=size
  4355.     * < d3.hw=gs drum map number(0,1:PRESET)
  4356.     * < d3.lw=gs id number(0-127,-1:current)
  4357.     * > d0.l=error code
  4358.     bsr    get_m_out_addr
  4359.     tst.l    d2
  4360.     beq    t_illegal_string_length
  4361.     cmpi.l    #12,d2
  4362.     bhi    t_illegal_string_length
  4363.     bsr    getset_gs_id        *ID保存/取得
  4364.  
  4365.     lea    header+2(pc),a2
  4366.     move.b    d3,(a2)+        *set dev ID
  4367.     move.b    #$42,(a2)+        *set model id
  4368.     addq.w    #1,a2
  4369.     move.b    #$41,(a2)+
  4370.     clr.w    (a2)+
  4371.     move.l    d3,d0
  4372.     swap    d0
  4373.     tst.b    d0
  4374.     beq    1f
  4375.     move.w    #$1000,-2(a2)
  4376. 1:
  4377.     bsr    send_header
  4378.     bsr    trans_midi_dat        * > d3=sum
  4379.     add.b    #$10,d3            *$10=addr sum
  4380.     andi.b    #$7f,d3
  4381.     moveq.l    #$80,d0
  4382.     sub.b    d3,d0
  4383.     andi.b    #$7f,d0
  4384.     jsr    (a5)
  4385.     moveq.l    #$f7,d0
  4386.     jsr    (a5)
  4387.     t_dat_ok
  4388.  
  4389. gs_print:
  4390.     *   cmd=$27
  4391.     * < a1.l=data address
  4392.     * < d1.w=midi-out port number(0-3,-1:current)
  4393.     * < d2.l=size
  4394.     * < d3.b=gs id number(0-127,-1:current)
  4395.     * > d0.l=error code
  4396.     bsr    get_m_out_addr
  4397.     tst.l    d2
  4398.     beq    t_illegal_string_length
  4399.     cmpi.l    #32,d2
  4400.     bhi    t_illegal_string_length
  4401.     bsr    getset_gs_id            *ID保存/取得
  4402.  
  4403.     lea    header+2(pc),a2
  4404.     move.b    d3,(a2)+        *set dev ID
  4405.     move.b    #$45,(a2)+        *set model id
  4406.     addq.w    #1,a2
  4407.     move.b    #$10,(a2)+
  4408.     clr.w    (a2)+
  4409.     bsr    send_header
  4410.     bsr    trans_midi_dat        * > d3=sum
  4411.     add.b    #$10,d3            *$10=addr sum
  4412.     andi.b    #$7f,d3
  4413.     moveq.l    #$80,d0
  4414.     sub.b    d3,d0
  4415.     andi.b    #$7f,d0
  4416.     jsr    (a5)
  4417.     moveq.l    #$f7,d0
  4418.     jsr    (a5)
  4419.     t_dat_ok
  4420.  
  4421. gs_display:            *SC55の画面にドットパターンを表示する
  4422.     *   cmd=$28
  4423.     * < a1.l=data address
  4424.     * < d1.w=midi-out port number(0-3,-1:current)
  4425.     * < d3.b=gs id number(0-127,-1:current)
  4426.     * > d0.l=error code
  4427.     bsr    get_m_out_addr
  4428.     bsr    getset_gs_id            *ID保存/取得
  4429.     move.l    v_buffer(pc),a2
  4430.  
  4431.     moveq.l    #16-1,d4
  4432. mk_ddlp:
  4433.     move.w    (a1)+,d1
  4434.     move.b    d1,d0
  4435.     lsl.b    #4,d0
  4436.     andi.b    #$10,d0
  4437.     move.b    d0,48(a2)
  4438.     move.w    d1,d0
  4439.     lsr.w    #1,d0
  4440.     andi.b    #$1f,d0
  4441.     move.b    d0,32(a2)
  4442.     move.w    d1,d0
  4443.     lsr.w    #6,d0
  4444.     andi.b    #$1f,d0
  4445.     move.b    d0,16(a2)
  4446.     rol.w    #5,d1            *same as lsr.w    #11,d1
  4447.     andi.b    #$1f,d1
  4448.     move.b    d1,(a2)+
  4449.     dbra    d4,mk_ddlp
  4450.  
  4451.     lea    header+2(pc),a2
  4452.     move.b    d3,(a2)+        *set dev id
  4453.     move.b    #$45,(a2)+        *set model id
  4454.     addq.w    #1,a2
  4455.     move.b    #$10,(a2)+        *address H
  4456.     move.w    #$0100,(a2)+        *address L
  4457.     bsr    send_header
  4458.     moveq.l    #64,d2            *data length
  4459.     move.l    v_buffer(pc),a1
  4460.     bsr    trans_midi_dat        *データ本体を転送(> d3=sum)
  4461.     add.b    #$11,d3            *$11=addr sum
  4462.     andi.b    #$7f,d3
  4463.     moveq.l    #$80,d0
  4464.     sub.b    d3,d0
  4465.     andi.b    #$7f,d0
  4466.     jsr    (a5)
  4467.     moveq.l    #$f7,d0
  4468.     jsr    (a5)
  4469.     t_dat_ok
  4470.  
  4471. gm_system_on:                *GMシステム・オン
  4472.     *   cmd=$29
  4473.     * < d1.w=midi-out port number(0-3,-1:current)
  4474.     * > d0.l=error code
  4475.     bsr    get_m_out_addr
  4476.     lea    gmon_dat(pc),a1
  4477. @@:
  4478.     move.b    (a1)+,d0
  4479.     beq    t_dat_ok
  4480.     jsr    (a5)
  4481.     bra    @b
  4482.  
  4483. gmon_dat:
  4484.     dc.b    $f0,$7e,$7f,$09,$01,$f7
  4485.     dc.b    0
  4486.     .even
  4487.  
  4488. mt32_reset:            *MT32の初期化
  4489.     *   cmd=$30
  4490.     * < d1.w=midi-out port number(0-3,-1:current)
  4491.     * < d3.b=mt32 id number(0-127,-1:current)
  4492.     * > d0.l=error code
  4493.     bsr    get_m_out_addr
  4494.     bsr    getset_mt32_id            *ID保存/取得
  4495.     lea    header(pc),a1
  4496.     moveq.l    #11,d2
  4497.     move.b    d3,2(a1)
  4498.     move.b    #$16,3(a1)
  4499.     move.b    #$7f,5(a1)
  4500.     move.l    #$00000001,6(a1)
  4501.     bsr    trans_midi_dat
  4502.     t_dat_ok
  4503.  
  4504. mt32_partial_reserve:                *MT32のパーシャルリザーブを設定
  4505.     *   cmd=$31
  4506.     * < a1.l=data address
  4507.     * < d1.w=midi-out port number(0-3,-1:current)
  4508.     * < d3.b=mt32 id number(0-127,-1:current)
  4509.     * > d0.l=error code
  4510.     bsr    get_m_out_addr
  4511.     bsr    getset_mt32_id            *ID保存/取得
  4512.     lea    header+2(pc),a2
  4513.     move.b    d3,(a2)+        *set dev ID
  4514.     move.b    #$16,(a2)+        *set model id
  4515.     addq.w    #1,a2
  4516.     move.b    #$10,(a2)+        *set addr H
  4517.     move.w    #$0004,(a2)+        *set addr L
  4518.     bsr    send_header
  4519.     moveq.l    #9,d2
  4520.     bsr    trans_midi_dat        *data 本体を転送(> d3=sum)
  4521.     add.b    #$14,d3            *$14=addr sum
  4522.     andi.b    #$7f,d3
  4523.     moveq.l    #$80,d0
  4524.     sub.b    d3,d0
  4525.     andi.b    #$7f,d0
  4526.     jsr    (a5)
  4527.     moveq.l    #$f7,d0
  4528.     jsr    (a5)
  4529.     t_dat_ok
  4530.  
  4531. mt32_reverb:                *MT32のリバーブパラメータ設定
  4532.     *   cmd=$32
  4533.     * < a1.l=data address
  4534.     * < d1.w=midi-out port number(0-3,-1:current)
  4535.     * < d2.l=size
  4536.     * < d3.b=mt32 id number(0-127,-1:current)
  4537.     * > d0.l=error code
  4538.     bsr    get_m_out_addr
  4539.     tst.l    d2
  4540.     beq    t_illegal_data_size
  4541.     cmpi.l    #3,d2
  4542.     bhi    t_illegal_data_size
  4543.     bsr    getset_mt32_id            *ID保存/取得
  4544.     lea    header+2(pc),a2
  4545.     move.b    d3,(a2)+        *set dev ID
  4546.     move.b    #$16,(a2)+        *set model id
  4547.     addq.w    #1,a2
  4548.     move.b    #$10,(a2)+        *set addr H
  4549.     move.w    #$0001,(a2)+        *set addr L
  4550.     bsr    send_header
  4551.     bsr    trans_midi_dat        *data 本体を転送(> d3=sum)
  4552.     add.b    #$11,d3            *$11=addr sum
  4553.     andi.b    #$7f,d3
  4554.     moveq.l    #$80,d0
  4555.     sub.b    d3,d0
  4556.     andi.b    #$7f,d0
  4557.     jsr    (a5)
  4558.     moveq.l    #$f7,d0
  4559.     jsr    (a5)
  4560.     t_dat_ok
  4561.  
  4562. mt32_part_setup:            *MT32のパートパラメータ設定
  4563.     *   cmd=$33
  4564.     * < a1.l=data address
  4565.     * < d1.w=midi-out port number(0-3,-1:current)
  4566.     * < d2.l=size
  4567.     * < d3.b=mt32 id number(0-127,-1:current)
  4568.     * > d0.l=error code
  4569.     bsr    get_m_out_addr
  4570.     tst.l    d2
  4571.     beq    t_illegal_data_size
  4572.     cmpi.l    #9,d2
  4573.     bhi    t_illegal_data_size
  4574.     bsr    getset_mt32_id        *ID保存/取得
  4575.     lea    header+2(pc),a2
  4576.     move.b    d3,(a2)+        *set dev ID
  4577.     move.b    #$16,(a2)+        *set model id
  4578.     addq.w    #1,a2
  4579.     move.b    #$10,(a2)+        *set addr H
  4580.     move.w    #$000d,(a2)+        *set addr L
  4581.     bsr    send_header
  4582.  
  4583.     move.l    v_buffer(pc),a2
  4584.     move.l    d2,d1
  4585.     subq.w    #1,d1            *for dbra
  4586. mk_mdch_lp:                *1~16->$00~$0f
  4587.     move.b    (a1)+,d0
  4588.     subq.b    #1,d0
  4589.     cmpi.b    #$0f,d0
  4590.     bls    @f
  4591.     moveq.l    #$10,d0            *規定外はOFFとみなす
  4592. @@:
  4593.     move.b    d0,(a2)+
  4594.     dbra    d1,mk_mdch_lp
  4595.     move.l    v_buffer(pc),a1
  4596.     bsr    trans_midi_dat        *data 本体を転送(> d3=sum)
  4597.     add.b    #$1d,d3            *$1d=addr sum
  4598.     andi.b    #$7f,d3
  4599.     moveq.l    #$80,d0
  4600.     sub.b    d3,d0
  4601.     andi.b    #$7f,d0
  4602.     jsr    (a5)
  4603.     moveq.l    #$f7,d0
  4604.     jsr    (a5)
  4605.     t_dat_ok
  4606.  
  4607. mt32_drum_setup:            *MT32のドラムパラメータ設定
  4608.     *   cmd=$34
  4609.     * < a1.l=data address
  4610.     * < d1.w=midi-out port number(0-3,-1:current)
  4611.     * < d2.l=size
  4612.     * < d3.hw=tone no
  4613.     * < d3.lw=mt32 id number(0-127,-1:current)
  4614.     * > d0.l=error code
  4615.     bsr    get_m_out_addr
  4616.     tst.l    d2
  4617.     beq    t_illegal_data_size
  4618.     cmpi.l    #4,d2
  4619.     bhi    t_illegal_data_size
  4620.     bsr    getset_mt32_id            *ID保存/取得
  4621.     lea    header+2(pc),a2
  4622.     move.b    d3,(a2)+        *set dev ID
  4623.     move.b    #$16,(a2)+        *set model id
  4624.     addq.w    #1,a2
  4625.     move.l    #$030110,d4        *parameter base address
  4626.     swap    d3
  4627.     cmpi.w    #87,d3
  4628.     bhi    t_illegal_note_number    *MTでは受信不可
  4629.     sub.w    #24,d3
  4630.     bmi    t_illegal_note_number
  4631.     add.w    d3,d3
  4632.     add.w    d3,d3
  4633.     add.w    d3,d4            *exact address
  4634.     bclr.l    #7,d4
  4635.     beq    @f
  4636.     add.w    #$0100,d4
  4637. @@:
  4638.     swap    d4
  4639.     move.b    d4,(a2)+        *set addr H
  4640.     move.b    d4,d1            *sum
  4641.     swap    d4
  4642.     move.w    d4,(a2)+        *set addr L
  4643.     add.b    d4,d1
  4644.     lsr.w    #8,d4
  4645.     add.b    d4,d1            *sum
  4646.     move.b    d1,-(sp)
  4647.     bsr    send_header
  4648.     bsr    trans_midi_dat        *data 本体を転送(> d3=sum)
  4649.     add.b    (sp)+,d3        *addr sum
  4650.     andi.b    #$7f,d3
  4651.     moveq.l    #$80,d0
  4652.     sub.b    d3,d0
  4653.     andi.b    #$7f,d0
  4654.     jsr    (a5)
  4655.     moveq.l    #$f7,d0
  4656.     jsr    (a5)
  4657.     t_dat_ok
  4658.  
  4659. mt32_common:            *MT32の音色コモンパラメータ設定
  4660.     *   cmd=$35
  4661.     * < a1.l=data address
  4662.     * < d1.w=midi-out port number(0-3,-1:current)
  4663.     * < d2.l=size
  4664.     * < d3.hw=program number(1-64)
  4665.     * < d3.lw=mt32 id number(0-127,-1:current)
  4666.     * > d0.l=error code
  4667.     bsr    get_m_out_addr
  4668.     tst.l    d2
  4669.     beq    t_illegal_data_size
  4670.     cmpi.l    #15,d2
  4671.     bhi    t_illegal_data_size
  4672.     bsr    getset_mt32_id            *ID保存/取得
  4673.     lea    header+2(pc),a2
  4674.     move.b    d3,(a2)+        *set dev ID
  4675.     move.b    #$16,(a2)+        *set model id
  4676.     addq.w    #1,a2
  4677.     move.l    #$080000,d4        *base address
  4678.     swap    d3
  4679.     subq.w    #1,d3            *make prog number 0-63
  4680.     bmi    t_illegal_tone_number
  4681.     cmpi.w    #63,d3
  4682.     bhi    t_illegal_tone_number
  4683.     ror.w    #7,d3            *d3=d3*512
  4684.     move.w    d3,d4            *exact address
  4685.     swap    d4
  4686.     move.b    d4,(a2)+        *set addr H
  4687.     move.b    d4,d1            *sum
  4688.     swap    d4
  4689.     move.w    d4,(a2)+        *set addr L
  4690.     add.b    d4,d1
  4691.     lsr.w    #8,d4
  4692.     add.b    d4,d1            *address sum
  4693.     move.b    d1,-(sp)        *sum保存
  4694.     bsr    send_header        *send header
  4695.     move.l    v_buffer(pc),a2
  4696.     moveq.l    #0,d0
  4697. @@:
  4698.     addq.l    #1,d0        *文字数カウント
  4699.     move.b    (a1)+,(a2)+
  4700.     bne    @b
  4701.     subq.w    #1,a2
  4702.     moveq.l    #10+1,d1
  4703.     sub.l    d0,d1
  4704.     beq    trns_cmp        *10文字丁度:他のパラメータの処理に
  4705.     bmi    t_illegal_string_length    *10文字以上:エラー
  4706.     subq.b    #1,d1            *for dbra
  4707. @@:
  4708.     move.b    #" ",(a2)+        *足りない分をスペースで埋める
  4709.     dbra    d1,@b
  4710. trns_cmp:
  4711.     sub.l    d0,d2
  4712.     bmi    t_illegal_parameter_format    *異常事態発生
  4713.     beq    send_cmdt
  4714.     move.l    d2,d0
  4715.     subq.l    #1,d0            *for dbra
  4716. @@:
  4717.     move.b    (a1)+,(a2)+        *数値パラメータをワークへ
  4718.     dbra    d0,@b
  4719. send_cmdt:
  4720.     add.w    #10,d2            *データ総バイト数
  4721.     move.l    v_buffer(pc),a1
  4722.     bsr    trans_midi_dat        *data 本体を転送(> d3=sum)
  4723.     add.b    (sp)+,d3        *addr sum
  4724.     andi.b    #$7f,d3
  4725.     moveq.l    #$80,d0
  4726.     sub.b    d3,d0
  4727.     andi.b    #$7f,d0
  4728.     jsr    (a5)
  4729.     moveq.l    #$f7,d0
  4730.     jsr    (a5)
  4731.     t_dat_ok
  4732.  
  4733. mt32_partial:            *MT32の音色パーシャルパラメータ設定
  4734.     *   cmd=$36
  4735.     * < a1.l=data address
  4736.     * < d1.w=midi-out port number(0-3,-1:current)
  4737.     * < d2.l=size
  4738.     * < d3.hw=program number(1-64)*256+partial number(1-4)
  4739.     * < d3.lw=mt32 id number(0-127,-1:current)
  4740.     * > d0.l=error code
  4741.     bsr    get_m_out_addr
  4742.     tst.l    d2
  4743.     beq    t_illegal_data_size
  4744.     cmpi.l    #58,d2
  4745.     bhi    t_illegal_data_size
  4746.     bsr    getset_mt32_id        *ID保存/取得
  4747.  
  4748.     lea    header+2(pc),a2
  4749.     move.b    d3,(a2)+        *set dev ID
  4750.     move.b    #$16,(a2)+        *set model id
  4751.     addq.w    #1,a2
  4752.     move.l    #$080000,d4        *base address
  4753.     swap    d3
  4754.     move.w    d3,d5            *後でパーシャルナンバーとして使う
  4755.     lsr.w    #8,d3
  4756.     subq.w    #1,d3            *make prog number 0-63
  4757.     bmi    t_illegal_tone_number
  4758.     cmpi.w    #64-1,d3
  4759.     bhi    t_illegal_tone_number
  4760.     ror.w    #7,d3            *d3=d3*512
  4761.     move.w    d3,d4
  4762.     subq.b    #1,d5            *1-4 -> 0-3
  4763.     bmi    t_illegal_parameter_value
  4764.     cmpi.b    #4-1,d5
  4765.     bhi    t_illegal_parameter_value
  4766.     ext.w    d5
  4767.     mulu    #58,d5            *1パーシャルのパラメータ数
  4768.     add.w    #$0e,d5            *partial offset
  4769.     move.b    d5,d4
  4770.     andi.b    #$7f,d4
  4771.     add.w    d5,d5            *lsl.w    #1,d5
  4772.     andi.w    #$7f00,d5
  4773.     add.w    d5,d4            *exact address
  4774.     swap    d4
  4775.     move.b    d4,(a2)+        *set addr H
  4776.     move.b    d4,d1            *sum
  4777.     swap    d4
  4778.     move.w    d4,(a2)+        *set addr L
  4779.     add.b    d4,d1
  4780.     lsr.w    #8,d4
  4781.     add.b    d4,d1            *address sum
  4782.     move.b    d1,-(sp)
  4783.     bsr    send_header        *send header
  4784.     bsr    trans_midi_dat        *data 本体を転送(> d3=sum)
  4785.     add.b    (sp)+,d3        *addr sum
  4786.     andi.b    #$7f,d3
  4787.     moveq.l    #$80,d0
  4788.     sub.b    d3,d0
  4789.     andi.b    #$7f,d0
  4790.     jsr    (a5)
  4791.     moveq.l    #$f7,d0
  4792.     jsr    (a5)
  4793.     t_dat_ok
  4794.  
  4795. mt32_patch:                *MT32の音色パッチパラメータ設定
  4796.     *   cmd=$37
  4797.     * < a1.l=data address
  4798.     * < d1.w=midi-out port number(0-3,-1:current)
  4799.     * < d2.l=size
  4800.     * < d3.hw=patch number(1-128)
  4801.     * < d3.lw=mt32 id number(0-127,-1:current)
  4802.     * > d0.l=error code
  4803.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  4804.     tst.l    d2
  4805.     beq    t_illegal_data_size
  4806.     cmpi.l    #7,d2
  4807.     bhi    t_illegal_data_size
  4808.     bsr    getset_mt32_id        *ID保存/取得
  4809.  
  4810.     lea    header+2(pc),a2
  4811.     move.b    d3,(a2)+        *set dev ID
  4812.     move.b    #$16,(a2)+        *set model id
  4813.     addq.w    #1,a2
  4814.     move.l    #$050000,d4        *base address
  4815.     swap    d3
  4816.     subq.w    #1,d3        *make patch number 0-127
  4817.     bmi    t_illegal_tone_number
  4818.     cmpi.w    #127,d3
  4819.     bhi    t_illegal_tone_number
  4820.     lsl.w    #3,d3        *d3=d3*8
  4821.     move.b    d3,d4
  4822.     andi.b    #$7f,d4
  4823.     add.w    d3,d3        *lsl.w    #1,d3
  4824.     andi.w    #$7f00,d3
  4825.     add.w    d3,d4            *exact address
  4826.     swap    d4
  4827.     move.b    d4,(a2)+        *set addr H
  4828.     move.b    d4,d1            *sum
  4829.     swap    d4
  4830.     move.w    d4,(a2)+        *set addr L
  4831.     add.b    d4,d1
  4832.     lsr.w    #8,d4
  4833.     add.b    d4,d1            *address sum
  4834.     move.b    d1,-(sp)
  4835.     bsr    send_header        *send header
  4836.     bsr    trans_midi_dat        *data 本体を転送(> d3=sum)
  4837.     add.b    (sp)+,d3        *addr sum
  4838.     andi.b    #$7f,d3
  4839.     moveq.l    #$80,d0
  4840.     sub.b    d3,d0
  4841.     andi.b    #$7f,d0
  4842.     jsr    (a5)
  4843.     moveq.l    #$f7,d0
  4844.     jsr    (a5)
  4845.     t_dat_ok
  4846.  
  4847. mt32_print:
  4848.     *   cmd=$38
  4849.     * < a1.l=data address
  4850.     * < d1.w=midi-out port number(0-3,-1:current)
  4851.     * < d2.l=size
  4852.     * < d3.b=mt32 id number(0-127,-1:current)
  4853.     * > d0.l=error code
  4854.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  4855.     tst.l    d2
  4856.     beq    t_illegal_string_length
  4857.     cmpi.l    #20,d2
  4858.     bhi    t_illegal_string_length
  4859.     bsr    getset_mt32_id        *ID保存/取得
  4860.  
  4861.     lea    header+2(pc),a2
  4862.     move.b    d3,(a2)+        *set dev ID
  4863.     move.b    #$16,(a2)+        *set model id
  4864.     addq.w    #1,a2
  4865.     move.b    #$20,(a2)+
  4866.     clr.w    (a2)+
  4867.     bsr    send_header
  4868.     bsr    trans_midi_dat        *(> d3=sum)
  4869.     add.b    #$20,d3            *addr sum
  4870.     andi.b    #$7f,d3
  4871.     moveq.l    #$80,d0
  4872.     sub.b    d3,d0
  4873.     andi.b    #$7f,d0
  4874.     jsr    (a5)
  4875.     moveq.l    #$f7,d0
  4876.     jsr    (a5)
  4877.     t_dat_ok
  4878.  
  4879. u220_setup:                *U220のセットアップパラメータ設定
  4880.     *   cmd=$39
  4881.     * < a1.l=data address
  4882.     * < d1.w=midi-out port number(0-3,-1:current)
  4883.     * < d3.b=u220 id number(0-127,-1:current)
  4884.     * > d0.l=error code
  4885.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  4886.     bsr    getset_u220_id        *ID保存/取得
  4887.  
  4888.     lea    header+2(pc),a2
  4889.     move.b    d3,(a2)+        *set dev ID
  4890.     move.b    #$2b,(a2)+        *set model id
  4891.     addq.w    #1,a2
  4892.     clr.b    (a2)+            *set addr H
  4893.     clr.w    (a2)+            *set addr L
  4894.     bsr    send_header
  4895.     move.l    v_buffer(pc),a2
  4896.     move.l    #$0e07_0a00,(a2)+    *440.0Hz,LCD=10
  4897.     move.b    (a1)+,d0        *chorus sw
  4898.     add.b    d0,d0            *lsl.b    #1,d0
  4899.     or.b    (a1)+,d0        *reverb sw
  4900.     move.b    d0,-1(a2)
  4901.     clr.l    (a2)+            *dummy data
  4902.     move.b    (a1)+,d0        *Rx_ctrl channel
  4903.     subq.b    #1,d0
  4904.     cmpi.b    #$0f,d0
  4905.     bls    @f
  4906.     moveq.l    #$10,d0        *規定外はOFFとみなす
  4907. @@:
  4908.     bsr    stu2_dt
  4909.     clr.b    (a2)+        *dummy data
  4910.     clr.b    (a2)+
  4911.     moveq.l    #4-1,d2
  4912. @@:
  4913.     move.b    (a1)+,(a2)+    *patch change,timbre change,rythm change,Rx.R.inst Assign
  4914.     dbra    d2,@b
  4915.  
  4916.     moveq.l    #16,d2        *d2=size
  4917.     move.l    v_buffer(pc),a1
  4918.     bsr    trans_midi_dat    *(> d3=sum)
  4919.     andi.b    #$7f,d3
  4920.     moveq.l    #$80,d0
  4921.     sub.b    d3,d0
  4922.     andi.b    #$7f,d0
  4923.     jsr    (a5)
  4924.     moveq.l    #$f7,d0
  4925.     jsr    (a5)
  4926.     t_dat_ok
  4927.  
  4928. stu2_dtw:            *set data その2
  4929.     * < a2.l=buffer address
  4930.     * < d0.w=data
  4931.     bsr    stu2_dt
  4932.     lsr.w    #8,d0
  4933. stu2_dt:            *set data
  4934.     * < a2.l=buffer address
  4935.     * < d0.b=data
  4936.     move.b    d0,-(sp)
  4937.     andi.b    #$0f,d0
  4938.     move.b    d0,(a2)+
  4939.     move.b    (sp)+,d0
  4940.     lsr.b    #4,d0
  4941.     move.b    d0,(a2)+
  4942.     rts
  4943.  
  4944. u220_part_setup:            *U220のテンポラリーパッチの(PART)パラメータ設定
  4945.     *   cmd=$3a
  4946.     * < a1.l=data address
  4947.     * < d1.w=midi-out port number(0-3,-1:current)
  4948.     * < d3.hw=part number(1~6)
  4949.     * < d3.lw=u220 id number(0-127,-1:current)
  4950.     * > d0.l=error code
  4951.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  4952.     bsr    getset_u220_id        *ID保存/取得
  4953.  
  4954.     lea    header+2(pc),a2
  4955.     move.b    d3,(a2)+    *set dev ID
  4956.     move.b    #$2b,(a2)+    *set model id
  4957.     addq.w    #1,a2
  4958.     moveq.l    #$3c,d4        *base address
  4959.     swap    d3
  4960.     subq.w    #1,d3        *make 1-6 -> 0-5
  4961.     bmi    t_illegal_part_number
  4962.     cmpi.w    #5,d3
  4963.     bhi    t_illegal_part_number
  4964.     lsl.w    #4,d3        *d3=d3*16
  4965.     add.w    d3,d4
  4966.     move.l    d4,d3
  4967.     andi.b    #$7f,d3
  4968.     add.w    d4,d4        *lsl.w    #1,d4
  4969.     andi.w    #$7f00,d4
  4970.     move.b    d3,d4
  4971.     ori.w    #$0600,d4    *d4=exact address
  4972.     swap    d4
  4973.     move.b    d4,(a2)+    *set addr H
  4974.     move.b    d4,d1        *sum
  4975.     swap    d4
  4976.     move.w    d4,(a2)+    *set addr L
  4977.     add.b    d4,d1
  4978.     lsr.w    #8,d4
  4979.     add.b    d4,d1        *address sum
  4980.     move.b    d1,-(sp)
  4981.     bsr    send_header
  4982.     move.l    v_buffer(pc),a2
  4983.     move.b    (a1),d0        *timbre number
  4984.     subq.b    #1,d0        *1~128→0~127
  4985.     bmi    t_illegal_tone_number
  4986.     move.b    10(a1),d1    *Rx.volume
  4987.     lsl.b    #7,d1
  4988.     or.b    d1,d0
  4989.     bsr    stu2_dt
  4990.  
  4991.     move.b    1(a1),d0    *v reserve
  4992.     move.b    7(a1),d1    *out assign
  4993.     lsl.b    #5,d1
  4994.     or.b    d1,d0
  4995.     bsr    stu2_dt
  4996.  
  4997.     moveq.l    #0,d0
  4998.     move.b    2(a1),d0    *midi ch
  4999.     subq.b    #1,d0
  5000.     cmpi.b    #$0f,d0
  5001.     bls    @f
  5002.     moveq.l    #$10,d0        *規定外OFFとみなす
  5003. @@:
  5004.     moveq.l    #0,d1
  5005.     move.b    8(a1),d1    *part level
  5006.     lsl.w    #5,d1
  5007.     or.w    d1,d0
  5008.     move.b    9(a1),d1    *part pan
  5009.     swap    d1
  5010.     lsr.l    #4,d1
  5011.     or.w    d1,d0
  5012.     bsr    stu2_dtw    *2bytes書き込み
  5013.  
  5014.     move.b    3(a1),d0    *k.range low
  5015.     move.b    12(a1),d1    *Rx.HOLD
  5016.     lsl.b    #7,d1
  5017.     or.b    d1,d0
  5018.     bsr    stu2_dt
  5019.  
  5020.     move.b    4(a1),d0    *k.range hi
  5021.     move.b    11(a1),d1    *Rx.PAN
  5022.     lsl.b    #7,d1
  5023.     or.b    d1,d0
  5024.     bsr    stu2_dt
  5025.  
  5026.     move.b    5(a1),d0    *velo level
  5027.     bsr    stu2_dt
  5028.     move.b    6(a1),d0    *velo threshold
  5029.     bsr    stu2_dt
  5030.  
  5031.     moveq.l    #16,d2
  5032.     move.l    v_buffer(pc),a1
  5033.     bsr    trans_midi_dat    *(>d3=sum)
  5034.     add.b    (sp)+,d3
  5035.     andi.b    #$7f,d3
  5036.     moveq.l    #$80,d0
  5037.     sub.b    d3,d0
  5038.     andi.b    #$7f,d0
  5039.     jsr    (a5)
  5040.     moveq.l    #$f7,d0
  5041.     jsr    (a5)
  5042.     t_dat_ok
  5043.  
  5044. u220_common:                *U220のテンポラリーパッチのコモンパラメータ設定
  5045.     *   cmd=$3b
  5046.     * < a1.l=data address
  5047.     * < d1.w=midi-out port number(0-3,-1:current)
  5048.     * < d3.b=u220 id number(0-127,-1:current)
  5049.     * > d0.l=error code
  5050.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  5051.     bsr    getset_u220_id        *ID保存/取得
  5052.  
  5053.     lea    header+2(pc),a2
  5054.     move.b    d3,(a2)+        *set dev ID
  5055.     move.b    #$2b,(a2)+        *set model id
  5056.     addq.w    #1,a2
  5057.     clr.b    (a2)+            *set addr H
  5058.     move.w    #$0618,(a2)+        *set addr L
  5059.     bsr    send_header
  5060.     move.l    v_buffer(pc),a2
  5061.     moveq.l    #0,d0
  5062.     move.b    4(a1),d0    *cho rate
  5063.     moveq.l    #0,d1
  5064.     move.b    2(a1),d1    *cho level
  5065.     lsl.w    #6,d1
  5066.     or.w    d1,d0
  5067.     move.b    5(a1),d1    *cho depth
  5068.     swap    d1        *lsl.l    #16,d1
  5069.     lsr.l    #5,d1
  5070.     or.w    d1,d0
  5071.     bsr    stu2_dtw
  5072.  
  5073.     moveq.l    #0,d0
  5074.     move.b    8(a1),d0    *rev time
  5075.     moveq.l    #0,d1
  5076.     move.b    6(a1),d1    *cho FB
  5077.     lsl.w    #7,d1
  5078.     or.w    d1,d0
  5079.     move.b    (a1),d1        *cho type
  5080.     swap    d1
  5081.     lsr.l    #3,d1
  5082.     or.w    d1,d0
  5083.     bsr    stu2_dtw
  5084.  
  5085.     moveq.l    #0,d0
  5086.     move.b    3(a1),d0    *cho delay time
  5087.     moveq.l    #0,d1
  5088.     move.b    10(a1),d1    *rev FB
  5089.     swap    d1
  5090.     lsr.l    #5,d1
  5091.     or.w    d1,d0
  5092.     bsr    stu2_dtw
  5093.  
  5094.     moveq.l    #0,d0
  5095.     move.b    9(a1),d0    *rev level
  5096.     moveq.l    #0,d1
  5097.     move.b    11(a1),d1    *pre rev dly time
  5098.     lsl.w    #6,d1
  5099.     or.w    d1,d0
  5100.     move.b    7(a1),d1    *rev type
  5101.     swap    d1
  5102.     lsr.l    #4,d1
  5103.     or.w    d1,d0
  5104.     add.w    d0,d0        *lsl.w    #1,d0
  5105.     move.b    1(a1),d1    *out mode
  5106.     lsr.b    #1,d1
  5107.     roxr.w    #1,d0
  5108.     bsr    stu2_dtw
  5109.  
  5110.     lea    12(a1),a1
  5111.     moveq.l    #3-1,d3
  5112. @@:
  5113.     move.b    (a1)+,d0    *ctrl #1-3
  5114.     ror.w    #8,d0
  5115.     move.b    (a1)+,d0    *parameter #1-3
  5116.     ror.w    #8,d0
  5117.     bsr    stu2_dtw
  5118.     dbra    d3,@b
  5119.  
  5120.     moveq.l    #28,d2
  5121.     move.l    v_buffer(pc),a1
  5122.     bsr    trans_midi_dat    *>d3=sum
  5123.     add.b    #$1e,d3        *address sum
  5124.     andi.b    #$7f,d3
  5125.     moveq.l    #$80,d0
  5126.     sub.b    d3,d0
  5127.     andi.b    #$7f,d0
  5128.     jsr    (a5)
  5129.     moveq.l    #$f7,d0
  5130.     jsr    (a5)
  5131.     t_dat_ok
  5132.  
  5133. u220_timbre:            *U220の音色パラメータ設定
  5134.     *   cmd=$3c
  5135.     * < a1.l=data address
  5136.     * < d1.w=midi-out port number(0-3,-1:current)
  5137.     * < d3.hw=program number(1-128)
  5138.     * < d3.lw=u220 id number(0-127,-1:current)
  5139.     * > d0.l=error code
  5140.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  5141.     bsr    getset_u220_id        *ID保存/取得
  5142.  
  5143.     lea    header+2(pc),a2
  5144.     move.b    d3,(a2)+        *set dev ID
  5145.     move.b    #$2b,(a2)+        *set model id
  5146.     addq.w    #1,a2
  5147.     swap    d3
  5148.     subq.w    #1,d3        *make prog number 0-127
  5149.     bmi    t_illegal_tone_number
  5150.     cmpi.w    #127,d3
  5151.     bhi    t_illegal_tone_number
  5152.     moveq.l    #0,d4
  5153.     lsl.w    #6,d3
  5154.     move.w    d3,d4
  5155.     andi.b    #$7f,d3
  5156.     add.l    d4,d4        *lsl.l    #1,d4
  5157.     move.b    d3,d4
  5158.     add.l    #$020000,d4    *d4=exact address
  5159.     swap    d4
  5160.     move.b    d4,(a2)+        *set addr H
  5161.     move.b    d4,d1            *sum
  5162.     swap    d4
  5163.     move.w    d4,(a2)+        *set addr L
  5164.     add.b    d4,d1
  5165.     lsr.w    #8,d4
  5166.     add.b    d4,d1            *address sum
  5167.     move.b    d1,-(sp)
  5168.     bsr    send_header        *send header
  5169.     move.l    v_buffer(pc),a2
  5170.     moveq.l    #0,d3
  5171. @@:
  5172.     addq.l    #1,d3        *文字数カウント
  5173.     move.b    (a1)+,d0
  5174.     beq    @f
  5175.     bsr    stu2_dt
  5176.     bra    @b
  5177. @@:
  5178.     moveq.l    #12+1,d1
  5179.     sub.l    d3,d1
  5180.     beq    trns_cmp_u    *12文字丁度:他のパラメータの処理に
  5181.     bmi    t_illegal_string_length
  5182.     subq.b    #1,d1        *for dbra
  5183. @@:
  5184.     moveq.l    #$20,d0
  5185.     bsr    stu2_dt        *足りない分をスペースで埋める
  5186.     dbra    d1,@b
  5187. trns_cmp_u:
  5188.     moveq.l    #0,d0
  5189.     move.b    1(a1),d0        *tone #
  5190.     subq.b    #1,d0
  5191.     bmi    t_illegal_note_number    *トーンナンバー異常
  5192.     moveq.l    #0,d1
  5193.     move.b    (a1),d1            *tone Meida
  5194.     lsl.w    #7,d1
  5195.     or.w    d1,d0
  5196.     move.b    17(a1),d1        *detune depth
  5197.     swap    d1
  5198.     lsr.l    #4,d1
  5199.     or.w    d1,d0
  5200.     bsr    stu2_dtw
  5201.  
  5202.     move.b    3(a1),d0        *level velo sens
  5203.     move.b    4(a1),d1        *level ch aft
  5204.     lsl.b    #4,d1
  5205.     or.b    d1,d0
  5206.     bsr    stu2_dt
  5207.     move.b    2(a1),d0        *timbre level
  5208.     bsr    stu2_dt
  5209.  
  5210.     move.b    5(a1),d0        *Env A
  5211.     move.b    6(a1),d1        *Env D
  5212.     lsl.b    #4,d1
  5213.     or.b    d1,d0
  5214.     bsr    stu2_dt
  5215.     move.b    7(a1),d0        *Env S
  5216.     move.b    8(a1),d1        *Env R
  5217.     lsl.b    #4,d1
  5218.     or.b    d1,d0
  5219.     bsr    stu2_dt
  5220.  
  5221.     move.b    10(a1),d0        *Pitch fine
  5222.     bsr    stu2_dt
  5223.     move.b    09(a1),d0        *Pitch coarse
  5224.     bsr    stu2_dt
  5225.  
  5226.     moveq.l    #0,d0
  5227.     move.b    11(a1),d0        *Bend lower
  5228.     moveq.l    #0,d1
  5229.     move.b    12(a1),d1        *Bend upper
  5230.     lsl.w    #5,d1
  5231.     or.w    d1,d0
  5232.     move.b    15(a1),d1        *Auto Bend depth
  5233.     swap    d1
  5234.     lsr.l    #7,d1
  5235.     or.w    d1,d0
  5236.     bsr    stu2_dtw
  5237.  
  5238.     moveq.l    #0,d0
  5239.     move.b    14(a1),d0        *Pitch poly aft
  5240.     moveq.l    #0,d1
  5241.     move.b    13(a1),d1        *Pitch ch aft
  5242.     lsl.w    #5,d1
  5243.     or.w    d1,d0
  5244.     move.b    16(a1),d1        *Auto Bend rate
  5245.     swap    d1
  5246.     lsr.l    #6,d1
  5247.     or.w    d1,d0
  5248.     bsr    stu2_dtw
  5249.  
  5250.     move.b    23(a1),d0        *Mod depth
  5251.     lsl.b    #4,d0
  5252.     bsr    stu2_dt
  5253.     move.b    21(a1),d0        *Vib delay
  5254.     move.b    20(a1),d1        *Vib depth
  5255.     lsl.b    #4,d1
  5256.     or.b    d1,d0
  5257.     bsr    stu2_dt
  5258.  
  5259.     move.b    18(a1),d0        *Vib rate
  5260.     bsr    stu2_dt
  5261.     move.b    19(a1),d0        *Vib WF
  5262.     bsr    stu2_dt
  5263.  
  5264.     move.b    22(a1),d0        *Vib rise
  5265.     bsr    stu2_dt
  5266.     move.b    24(a1),d0        *Vib ch aft
  5267.     move.b    25(a1),d1        *Vib poly aft
  5268.     lsl.b    #4,d1
  5269.     or.b    d1,d0
  5270.     bsr    stu2_dt
  5271.     moveq.l    #0,d0            *Dummy
  5272.     bsr    stu2_dtw
  5273. send_cmdt_u:
  5274.     moveq.l    #$40,d2            *データ総バイト数
  5275.     move.l    v_buffer(pc),a1
  5276.     bsr    trans_midi_dat        *data 本体を転送(>d3=sum)
  5277.     add.b    (sp)+,d3        *address sum
  5278.     andi.b    #$7f,d3
  5279.     moveq.l    #$80,d0
  5280.     sub.b    d3,d0
  5281.     andi.b    #$7f,d0
  5282.     jsr    (a5)
  5283.     moveq.l    #$f7,d0
  5284.     jsr    (a5)
  5285.     t_dat_ok
  5286.  
  5287. u220_drum_setup:                *U220のテンポラリーパッチの(DRUM)パラメータ設定
  5288.     *   cmd=$3d
  5289.     * < a1.l=data address
  5290.     * < d1.w=midi-out port number(0-3,-1:current)
  5291.     * < d3.b=u220 id number(0-127,-1:current)
  5292.     * > d0.l=error code
  5293.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  5294.     bsr    getset_u220_id        *ID保存/取得
  5295.  
  5296.     lea    header+2(pc),a2
  5297.     move.b    d3,(a2)+        *set dev ID
  5298.     move.b    #$2b,(a2)+        *set model id
  5299.     addq.w    #1,a2
  5300.     clr.b    (a2)+            *set addr H
  5301.     move.w    #$0634,(a2)+        *set addr L
  5302.     bsr    send_header
  5303.     move.l    v_buffer(pc),a2
  5304.     move.b    1(a1),d0        *rythm v rsv
  5305.     move.b    (a1),d1            *rythm set number
  5306.     lsl.b    #5,d1
  5307.     or.b    d1,d0
  5308.     bsr    stu2_dt
  5309.  
  5310.     move.b    2(a1),d0        *rythm part ch
  5311.     subq.b    #1,d0
  5312.     cmpi.b    #$0f,d0
  5313.     bls    @f
  5314.     moveq.l    #$10,d0            *規定外の時はOFFとみなす
  5315. @@:
  5316.     move.b    6(a1),d1        *rythm part Rx.HOLD
  5317.     lsl.b    #5,d1
  5318.     or.b    d1,d0
  5319.     move.b    5(a1),d1        *rythm part Rx.VOLUME
  5320.     lsl.b    #6,d1
  5321.     or.b    d1,d0
  5322.     bsr    stu2_dt
  5323.  
  5324.     move.b    3(a1),d0        *rythm part level
  5325.     move.b    4(a1),d1        *rythm part boost sw
  5326.     lsl.b    #7,d1
  5327.     or.b    d1,d0
  5328.     bsr    stu2_dt
  5329.     clr.w    (a2)            *dummy
  5330.  
  5331.     moveq.l    #8,d2
  5332.     move.l    v_buffer(pc),a1
  5333.     bsr    trans_midi_dat        *>d3=sum
  5334.     add.b    #$3a,d3            *address sum
  5335.     andi.b    #$7f,d3
  5336.     moveq.l    #$80,d0
  5337.     sub.b    d3,d0
  5338.     andi.b    #$7f,d0
  5339.     jsr    (a5)
  5340.     moveq.l    #$f7,d0
  5341.     jsr    (a5)
  5342.     t_dat_ok
  5343.  
  5344. u220_drum_inst:                *U220のテンポラリエリアのドラムの音色を変更する
  5345.     *   cmd=$3e
  5346.     * < a1.l=data address
  5347.     * < d1.w=midi-out port number(0-3,-1:current)
  5348.     * < d3.hw=patch number(35~99)
  5349.     * < d3.lw=u220 id number(0-127,-1:current)
  5350.     * > d0.l=error code
  5351.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  5352.     bsr    getset_u220_id        *ID保存/取得
  5353.  
  5354.     lea    header+2(pc),a2
  5355.     move.b    d3,(a2)+        *set dev ID
  5356.     move.b    #$2b,(a2)+        *set model id
  5357.     addq.w    #1,a2
  5358.     move.l    #$110000,d4        *base address
  5359.     swap    d3
  5360.     cmpi.w    #35,d3
  5361.     bcs    t_illegal_note_number
  5362.     cmpi.w    #99,d3
  5363.     bhi    t_illegal_note_number
  5364.     lsl.w    #8,d3            *d3=d3*256
  5365.     add.w    d3,d4            *exact address
  5366.     swap    d4
  5367.     move.b    d4,(a2)+        *set addr H
  5368.     move.b    d4,d1            *sum
  5369.     swap    d4
  5370.     move.w    d4,(a2)+        *set addr L
  5371.     add.b    d4,d1
  5372.     lsr.w    #8,d4
  5373.     add.b    d4,d1            *address sum
  5374.     move.b    d1,-(sp)
  5375.     bsr    send_header        *send header
  5376.     move.b    1(a1),d0
  5377.     subq.b    #1,d0
  5378.     bmi    t_illegal_tone_number
  5379.     move.b    1(a1),-(sp)        *save parameter
  5380.     move.b    d0,1(a1)
  5381.     moveq.l    #20-1,d2
  5382.     bsr    trans_midi_dat        *data 本体を転送(>d3=sum)
  5383.     move.b    (sp)+,1(a1)        *back parameter
  5384.     add.b    (sp)+,d3        *address sum
  5385.     andi.b    #$7f,d3
  5386.     moveq.l    #$80,d0
  5387.     sub.b    d3,d0
  5388.     andi.b    #$7f,d0
  5389.     jsr    (a5)
  5390.     moveq.l    #$f7,d0
  5391.     jsr    (a5)
  5392.     t_dat_ok
  5393.  
  5394. u220_print:
  5395.     *   cmd=$3f
  5396.     * < a1.l=data address
  5397.     * < d1.w=midi-out port number(0-3,-1:current)
  5398.     * < d2.l=size
  5399.     * < d3.b=u220 id number(0-127,-1:current)
  5400.     * > d0.l=error code
  5401.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  5402.     tst.l    d2
  5403.     beq    t_illegal_string_length
  5404.     cmpi.l    #12,d2
  5405.     bhi    t_illegal_string_length
  5406.     bsr    getset_u220_id        *ID保存/取得
  5407.  
  5408.     lea    header+2(pc),a2
  5409.     move.b    d3,(a2)+        *set dev ID
  5410.     move.b    #$2b,(a2)+        *set model id
  5411.     addq.w    #1,a2
  5412.     clr.b    (a2)+            *address H
  5413.     move.w    #$0600,(a2)+        *address L
  5414.     bsr    send_header
  5415.     move.l    v_buffer(pc),a2
  5416.     move.l    d2,d3
  5417.     subq.l    #1,d3        *for dbra
  5418. @@:
  5419.     move.b    (a1)+,d0
  5420.     bsr    stu2_dt
  5421.     dbra    d3,@b
  5422.     moveq.l    #12-1,d1
  5423.     sub.w    d2,d1
  5424.     bmi    send_u2pr
  5425. @@:
  5426.     moveq.l    #$20,d0        *SPC
  5427.     bsr    stu2_dt
  5428.     dbra    d1,@b
  5429. send_u2pr:
  5430.     moveq.l    #24,d2
  5431.     move.l    v_buffer(pc),a1
  5432.     bsr    trans_midi_dat    *>d3=sum
  5433.     addq.b    #$06,d3        *address sum
  5434.     andi.b    #$7f,d3
  5435.     moveq.l    #$80,d0
  5436.     sub.b    d3,d0
  5437.     andi.b    #$7f,d0
  5438.     jsr    (a5)
  5439.     moveq.l    #$f7,d0
  5440.     jsr    (a5)
  5441.     t_dat_ok
  5442.  
  5443. m1_setup:            *M1の受信MIDI CHの設定
  5444.     *   cmd=$40
  5445.     * < a1.l=data address
  5446.     * > d0.l=error code
  5447.     move.l    v_buffer(pc),a2
  5448.     addq.w    #8,a2
  5449.     lea    8(a2),a3
  5450.     moveq.l    #8-1,d2        *dbra count
  5451. m1_md_lp:
  5452.     moveq.l    #03,d1        *ON
  5453.     move.b    (a1)+,d0
  5454.     subq.b    #1,d0
  5455.     cmpi.b    #$0f,d0
  5456.     bls    @f
  5457.     moveq.l    #0,d0        *一応チャンネル1にする
  5458.     moveq.l    #0,d1        *OFF
  5459. @@:
  5460.     move.b    d0,(a2)+
  5461.     move.b    d1,(a3)+
  5462.     dbra    d2,m1_md_lp
  5463.     t_dat_ok
  5464.  
  5465. m1_part_setup:            *M1のSEQ SONG0の設定
  5466.     *   cmd=$41
  5467.     * < a1.l=data address
  5468.     * > d0.l=error code
  5469.     move.l    v_buffer(pc),a2
  5470.     lea    56(a2),a2
  5471.     moveq.l    #40-1,d2
  5472. @@:
  5473.     move.b    (a1)+,(a2)+
  5474.     dbra    d2,@b
  5475.     t_dat_ok
  5476.  
  5477. m1_effect_setup:        *M1のSEQ SONG0のEFFECTの設定
  5478.     *   cmd=$42
  5479.     * < a1.l=data address
  5480.     * > d0.l=error code
  5481.     lea    m1_ef_dflt(pc),a2
  5482.     moveq.l    #25-1,d2    *=dbra counter
  5483. @@:
  5484.     move.b    (a1)+,(a2)+
  5485.     dbra    d2,@b
  5486.     t_dat_ok
  5487.  
  5488. m1_print:            *M1のSEQ SONG0のNAME設定
  5489.     *   cmd=$43
  5490.     * < a1.l=data address
  5491.     * < d2.l=size
  5492.     * > d0.l=error code
  5493.     cmpi.l    #10,d2
  5494.     bhi    t_illegal_string_length
  5495.     move.l    v_buffer(pc),a2
  5496.     lea    20(a2),a2
  5497.     move.l    d2,d3
  5498.     subq.l    #1,d3        *for dbra
  5499.     bmi    t_illegal_string_length
  5500. @@:
  5501.     move.b    (a1)+,(a2)+
  5502.     dbra    d3,@b
  5503.     moveq.l    #10-1,d3
  5504.     sub.w    d2,d3
  5505.     bmi    t_dat_ok    *10文字丁度
  5506. @@:
  5507.     move.b    #$20,(a2)+    *SPC
  5508.     dbra    d3,@b
  5509.     t_dat_ok
  5510.  
  5511. send_to_m1:            *M1へパラメータを書き込む
  5512.     *   cmd=$44
  5513.     * < d1.w=midi-out port number(0-3,-1:current)
  5514.     * < d3.b=m1 id number(0-127,-1:current)
  5515.     * > d0.l=error code
  5516.     bsr    get_m_out_addr        *>a5=m_out_xx addr
  5517.     bsr    getset_m1_id        *ID保存/取得
  5518.  
  5519.     move.l    v_buffer(pc),a1
  5520.     move.l    #$f0420019,(a1)+    *header&maker ID,dummy,M1
  5521.     move.b    d3,-2(a1)        *ID
  5522.     move.l    #$48_00_0000,(a1)+    *cmd,bank,seq data size
  5523.     move.b    #$04,16(a1)        *beat
  5524.     move.b    #$78,17(a1)        *tempo/protect
  5525.     move.b    #$14,19(a1)        *next song
  5526.     clr.b    30(a1)            *nul
  5527.     lea    m1_ef_dflt+25(pc),a2
  5528.     moveq.l    #25-1,d0
  5529. @@:
  5530.     move.b    -(a2),31(a1,d0.w)    *エフェクトデータのセット
  5531.     dbra    d0,@b
  5532.  
  5533.     moveq.l    #96-1,d0            *データ列のならび変え
  5534. @@:
  5535.     move.l    d0,d1
  5536.     divu.w    #7,d1
  5537.     add.w    d0,d1
  5538.     move.b    (a1,d0.w),1(a1,d1.w)
  5539.     dbra    d0,@b
  5540.  
  5541.     moveq.l    #0,d2            *MIDIデータへの変換
  5542. stmlp:
  5543.     moveq.l    #7-1,d1
  5544.     moveq.l    #0,d3
  5545. @@:
  5546.     move.b    1(a1,d1.w),d0
  5547.     andi.b    #$7f,1(a1,d1.w)
  5548.     lsl.b    #1,d0
  5549.     roxl.b    #1,d3
  5550.     dbra    d1,@b
  5551.     move.b    d3,(a1)
  5552.     addq.w    #8,a1
  5553.     addq.w    #7,d2
  5554.     cmpi.w    #96,d2
  5555.     bls    stmlp
  5556. @@:
  5557.     move.l    v_buffer(pc),a1
  5558.     move.b    #$f7,$76(a1)        *EOX
  5559.     moveq.l    #$77,d2
  5560.     bsr    trans_midi_dat        *>d3=sum
  5561.  
  5562.     move.l    v_buffer(pc),a1        *SEQ0にする
  5563.     move.l    #$4e0600f7,4(a1)    *cmd,mode,bank,EOX
  5564.     moveq.l    #$8,d2
  5565.     bsr    trans_midi_dat        *>d3=sum
  5566.     t_dat_ok
  5567.  
  5568. sc88_mode_set:                    *SC88のモードセット
  5569.     *   cmd=$46
  5570.     * < d1.w=midi-out port number(0-3,-1:current)
  5571.     * < d3.hw=sc88 mode (0:single or 1:double)
  5572.     * < d3.lw=sc88 id number(0-127,-1:current)
  5573.     * > d0.l=error code
  5574.     bsr    get_m_out_addr
  5575.     bsr    getset_gs_id            *ID保存/取得
  5576.     lea    header(pc),a1
  5577.     moveq.l    #11,d2
  5578.     move.b    d3,2(a1)
  5579.     move.b    #$42,3(a1)
  5580.     clr.b    5(a1)        *00
  5581.     move.w    #$007f,6(a1)    *addr=00007f
  5582.     swap    d3
  5583.     move.b    d3,8(a1)
  5584.     bne    @f
  5585.     move.b    #$01,9(a1)    *case:mode=$00
  5586.     bsr    trans_midi_dat
  5587.     t_dat_ok
  5588. @@:                *case:mode=$01
  5589.     clr.b    9(a1)
  5590.     bsr    trans_midi_dat
  5591.     t_dat_ok
  5592.  
  5593. sc88_reverb:                *SC88のリバーブパラメータ設定
  5594.     *   cmd=$47
  5595.     * < d1.w=midi-out port number(0-3,-1:current)
  5596.     * < a1.l=data address
  5597.     * < d2.l=size
  5598.     * < d3.b=sc88 id number(0-127,-1:current)
  5599.     * > d0.l=error code
  5600.     bsr    get_m_out_addr
  5601.     tst.l    d2
  5602.     beq    t_illegal_data_size
  5603.     cmpi.l    #8,d2
  5604.     bhi    t_illegal_data_size
  5605.     bsr    getset_sc88_id        *ID保存/取得
  5606.     lea    header+2(pc),a2
  5607.     move.b    d3,(a2)+        *set dev ID
  5608.     move.b    #$42,(a2)+        *set model id
  5609.     addq.w    #1,a2
  5610.     move.b    #$40,(a2)+
  5611.     move.w    #$0130,(a2)+
  5612.     bsr    send_header
  5613.     bsr    trans_midi_dat        *> d3.b=sum
  5614.     add.b    #$40+$01+$30,d3
  5615.     andi.b    #$7f,d3
  5616.     moveq.l    #$80,d0
  5617.     sub.b    d3,d0
  5618.     andi.b    #$7f,d0
  5619.     jsr    (a5)
  5620.     moveq.l    #$f7,d0
  5621.     jsr    (a5)
  5622.     t_dat_ok
  5623.  
  5624. sc88_chorus:            *SC88のコーラスパラメータ設定
  5625.     *   cmd=$48
  5626.     * < d1.w=midi-out port number(0-3,-1:current)
  5627.     * < a1.l=data address
  5628.     * < d2.l=size
  5629.     * < d3.b=SC88 id number(0-127,-1:current)
  5630.     * > d0.l=error code
  5631.     bsr    get_m_out_addr
  5632.     tst.l    d2
  5633.     beq    t_illegal_data_size
  5634.     cmpi.l    #9,d2
  5635.     bhi    t_illegal_data_size
  5636.     bsr    getset_sc88_id            *ID保存/取得
  5637.     lea    header+2(pc),a2
  5638.     move.b    d3,(a2)+            *set dev ID
  5639.     move.b    #$42,(a2)+            *set model id
  5640.     addq.w    #1,a2
  5641.     move.b    #$40,(a2)+
  5642.     move.w    #$0138,(a2)+
  5643.     bsr    send_header
  5644.     bsr    trans_midi_dat            *> d3.b=sum
  5645.     add.b    #$40+$01+$38,d3
  5646.     andi.b    #$7f,d3
  5647.     moveq.l    #$80,d0
  5648.     sub.b    d3,d0
  5649.     andi.b    #$7f,d0
  5650.     jsr    (a5)
  5651.     moveq.l    #$f7,d0
  5652.     jsr    (a5)
  5653.     t_dat_ok
  5654.  
  5655. sc88_delay:            *SC88のディレイパラメータ設定
  5656.     *   cmd=$49
  5657.     * < d1.w=midi-out port number(0-3,-1:current)
  5658.     * < a1.l=data address
  5659.     * < d2.l=size
  5660.     * < d3.b=SC88 id number(0-127,-1:current)
  5661.     * > d0.l=error code
  5662.     bsr    get_m_out_addr
  5663.     tst.l    d2
  5664.     beq    t_illegal_data_size
  5665.     cmpi.l    #11,d2
  5666.     bhi    t_illegal_data_size
  5667.     bsr    getset_sc88_id            *ID保存/取得
  5668.     lea    header+2(pc),a2
  5669.     move.b    d3,(a2)+            *set dev ID
  5670.     move.b    #$42,(a2)+            *set model id
  5671.     addq.w    #1,a2
  5672.     move.b    #$40,(a2)+
  5673.     move.w    #$0150,(a2)+
  5674.     bsr    send_header
  5675.     bsr    trans_midi_dat            *> d3.b=sum
  5676.     add.b    #$40+$01+$50,d3
  5677.     andi.b    #$7f,d3
  5678.     moveq.l    #$80,d0
  5679.     sub.b    d3,d0
  5680.     andi.b    #$7f,d0
  5681.     jsr    (a5)
  5682.     moveq.l    #$f7,d0
  5683.     jsr    (a5)
  5684.     t_dat_ok
  5685.  
  5686. sc88_equalizer:            *SC88のイコライザ・パラメータ設定
  5687.     *   cmd=$4a
  5688.     * < d1.w=midi-out port number(0-3,-1:current)
  5689.     * < a1.l=data address
  5690.     * < d2.l=size
  5691.     * < d3.b=SC88 id number(0-127,-1:current)
  5692.     * > d0.l=error code
  5693.     bsr    get_m_out_addr
  5694.     tst.l    d2
  5695.     beq    t_illegal_data_size
  5696.     cmpi.l    #4,d2
  5697.     bhi    t_illegal_data_size
  5698.     bsr    getset_sc88_id            *ID保存/取得
  5699.     lea    header+2(pc),a2
  5700.     move.b    d3,(a2)+            *set dev ID
  5701.     move.b    #$42,(a2)+            *set model id
  5702.     addq.w    #1,a2
  5703.     move.b    #$40,(a2)+
  5704.     move.w    #$0200,(a2)+
  5705.     bsr    send_header
  5706.     bsr    trans_midi_dat            *> d3.b=sum
  5707.     add.b    #$40+$02+$00,d3
  5708.     andi.b    #$7f,d3
  5709.     moveq.l    #$80,d0
  5710.     sub.b    d3,d0
  5711.     andi.b    #$7f,d0
  5712.     jsr    (a5)
  5713.     moveq.l    #$f7,d0
  5714.     jsr    (a5)
  5715.     t_dat_ok
  5716.  
  5717. sc88_part_setup:                *SC88のパートパラメータ設定
  5718.     *   cmd=$4b
  5719.     * < a1.l=data address
  5720.     * < d1.w=midi-out port number(0-3,-1:current)
  5721.     * < d2.l=size(1~119)
  5722.     * < d3.hw=sc88 part number(1-16)
  5723.     * < d3.lw=sc88 id number(0-127,-1:current)
  5724.     * > d0.l=error code
  5725.     bsr    get_m_out_addr
  5726.     subq.w    #1,d2            *for dbra
  5727.     cmp.l    #127-1,d2
  5728.     bhi    t_illegal_data_size
  5729.     bsr    getset_sc88_id        *ID保存/取得
  5730.     lea    header+2(pc),a2
  5731.     move.b    d3,(a2)+        *set dev ID
  5732.     move.b    #$42,(a2)+        *set model id
  5733.     move.l    #$401002,d4        *inst address
  5734.     swap    d3
  5735.     cmpi.w    #16,d3
  5736.     bhi    t_illegal_part_number
  5737.     cmpi.b    #10,d3
  5738.     bcs    @f            *9以下はそのまま
  5739.     bhi    1f
  5740.     moveq.l    #0,d3            *10はd3=0
  5741.     bra    @f
  5742. 1:
  5743.     subq.b    #1,d3            *10以上はd3=d3-1
  5744. @@:
  5745.     lsl.w    #8,d3
  5746.     or.w    d3,d4            *d4.l=partナンバーに対応したアドレス値
  5747.     move.b    (a1),d0            *保存
  5748.     movem.l    d0/a1,-(sp)        *先頭データ保存
  5749.     subq.b    #1,d0            *MIDI CH(1~16)->内部コード($00~$0f)
  5750.     cmpi.b    #$0f,d0
  5751.     bls    @f
  5752.     moveq.l    #$10,d0            *範囲外はOFFとみなす
  5753. @@:
  5754.     move.b    d0,(a1)
  5755.  
  5756.     move.l    d4,d5
  5757.     move.l    a1,a3
  5758.     moveq.l    #0,d1
  5759.     moveq.l    #0,d3
  5760.     lea    sc88ptofs(pc),a2
  5761. ssptlp:
  5762.     add.b    (a1)+,d1
  5763.     addq.l    #1,d3
  5764.     addq.b    #1,d4        *どうせ上位は変化しないから
  5765.     move.w    d4,d0
  5766.     andi.w    #$f0ff,d0
  5767.     cmp.w    (a2),d0
  5768.     bne    @f
  5769.     bsr    send_gsptdt
  5770.     move.l    (a2)+,d0
  5771.     add.w    d0,d4
  5772.     move.l    d4,d5
  5773.     move.l    a1,a3
  5774.     moveq.l    #0,d1
  5775.     moveq.l    #0,d3
  5776. @@:
  5777.     dbra    d2,ssptlp
  5778.     tst.l    d3
  5779.     beq    @f
  5780.     bsr    send_gsptdt
  5781. @@:
  5782.     movem.l    (sp)+,d0/a1
  5783.     move.b    d0,(a1)        *書き換えた値をもとに戻す
  5784.     t_dat_ok
  5785.  
  5786. sc88ptofs:
  5787. *    dc.w    $1017,$0000
  5788.     dc.w    $1019,$0000
  5789.     dc.w    $1024,$0006
  5790.     dc.w    $102d,$0003
  5791.     dc.w    $1038,$0008
  5792.     dc.w    $104c,$0fb4
  5793.     dc.w    $200b,$0005
  5794.     dc.w    $201b,$0005
  5795.     dc.w    $202b,$0005
  5796.     dc.w    $203b,$0005
  5797.     dc.w    $204b,$0005
  5798.     dc.w    $205b,$1FA5
  5799.     dc.w    $4002,$001e
  5800.     dc.w    -1
  5801.  
  5802. sc88_drum_setup:            *SC88のドラムパラメータ設定    !v3
  5803.     *   cmd=$4c
  5804.     * < a1.l=data address
  5805.     * < d1.w=midi-out port number(0-3,-1:current)
  5806.     * < d2.l=size
  5807.     * < d3.hw=sc88 map number*256+note number
  5808.     * < d3.lw=sc88 id number(0-127,-1:current)
  5809.     * > d0.l=error code
  5810.     bsr    get_m_out_addr
  5811.     subq.w    #1,d2            *for dbra
  5812.     cmpi.l    #9-1,d2
  5813.     bhi    t_illegal_data_size
  5814.     bsr    getset_sc88_id        *ID保存/取得
  5815.     lea    header+2(pc),a2
  5816.     move.b    d3,(a2)+        *set dev ID
  5817.     move.b    #$42,(a2)+        *set model id
  5818.     move.l    #$410100,d4        *inst address
  5819.     swap    d3
  5820.     cmpi.b    #127,d3
  5821.     bhi    t_illegal_note_number
  5822.     move.b    d3,d4            *note set
  5823.     lsl.w    #4,d3
  5824.     andi.w    #$f000,d3
  5825.     or.w    d3,d4            *make address
  5826. @@:
  5827.     bsr    sc_p_set
  5828.     add.w    #$0100,d4
  5829.     addq.w    #1,a1
  5830.     dbra    d2,@b
  5831.     t_dat_ok
  5832.  
  5833. sc88_drum_name:
  5834.     *   cmd=$4d
  5835.     * < a1.l=data address
  5836.     * < d1.w=midi-out port number(0-2,-1:current)
  5837.     * < d2.l=size
  5838.     * < d3.hw=sc88 drum map number(0,1:PRESET/$80+0,1:USER)
  5839.     * < d3.lw=sc88 id number(0-127,-1:current)
  5840.     * > d0.l=error code
  5841.     bsr    get_m_out_addr
  5842.     tst.l    d2
  5843.     beq    t_illegal_string_length
  5844.     cmpi.l    #12,d2
  5845.     bhi    t_illegal_string_length
  5846.     bsr    getset_sc88_id        *ID保存/取得
  5847.  
  5848.     lea    header+2(pc),a2
  5849.     move.b    d3,(a2)+        *set dev ID
  5850.     move.b    #$42,(a2)+        *set model id
  5851.     addq.w    #1,a2
  5852.     move.b    #$41,(a2)+
  5853.     clr.w    (a2)+
  5854.     move.l    d3,d0
  5855.     swap    d0
  5856.     bclr.l    #7,d0
  5857.     bne    2f
  5858.     tst.b    d0
  5859.     beq    1f
  5860.     move.w    #$1000,-2(a2)
  5861. 1:
  5862.     bsr    send_header
  5863.     bsr    trans_midi_dat        * > d3=sum
  5864.     add.b    #$10,d3            *$10=addr sum
  5865.     andi.b    #$7f,d3
  5866.     moveq.l    #$80,d0
  5867.     sub.b    d3,d0
  5868.     andi.b    #$7f,d0
  5869.     jsr    (a5)
  5870.     moveq.l    #$f7,d0
  5871.     jsr    (a5)
  5872.     t_dat_ok
  5873. 2:
  5874.     move.b    #$21,-3(a2)
  5875.     tst.b    d0
  5876.     beq    1b
  5877.     move.w    #$1000,-2(a2)
  5878.     bra    1b
  5879.  
  5880. sc88_user_inst:                *SC88のユーザー音色パラメータ設定
  5881.     *   cmd=$4e
  5882.     * < a1.l=data address
  5883.     * < d1.w=midi-out port number(0-3,-1:current)
  5884.     * < d2.l=size
  5885.     * < d3.hw=sc88 bank number*256+program number
  5886.     * < d3.lw=sc88 id number(0-127,-1:current)
  5887.     * > d0.l=error code
  5888.     bsr    get_m_out_addr
  5889.     subq.w    #1,d2            *for dbra
  5890.     cmpi.l    #11-1,d2
  5891.     bhi    t_illegal_data_size
  5892.     bsr    getset_sc88_id        *ID保存/取得
  5893.     lea    header+2(pc),a2
  5894.     move.b    d3,(a2)+        *set dev ID
  5895.     move.b    #$42,(a2)+        *set model id
  5896.     move.l    #$200000,d4        *inst address
  5897.     swap    d3
  5898.     cmpi.b    #127,d3
  5899.     bhi    t_illegal_note_number
  5900.     move.b    d3,d4            *note set
  5901.     lsl.w    #4,d3
  5902.     andi.w    #$f000,d3
  5903.     or.w    d3,d4            *make address
  5904. @@:
  5905.     bsr    sc_p_set
  5906.     add.w    #$0100,d4
  5907.     addq.w    #1,a1
  5908.     dbra    d2,@b
  5909.     t_dat_ok
  5910.  
  5911. sc88_user_drum:                *SC88のユーザードラムセット・パラメータ設定
  5912.     *   cmd=$4f
  5913.     * < a1.l=data address
  5914.     * < d1.w=midi-out port number(0-3,-1:current)
  5915.     * < d2.l=size
  5916.     * < d3.hw=sc88 set number*256+note number
  5917.     * < d3.lw=sc88 id number(0-127,-1:current)
  5918.     * > d0.l=error code
  5919.     bsr    get_m_out_addr
  5920.     subq.w    #1,d2            *for dbra
  5921.     cmpi.l    #12-1,d2
  5922.     bhi    t_illegal_data_size
  5923.     bsr    getset_sc88_id        *ID保存/取得
  5924.     lea    header+2(pc),a2
  5925.     move.b    d3,(a2)+        *set dev ID
  5926.     move.b    #$42,(a2)+        *set model id
  5927.     move.l    #$210100,d4        *inst address
  5928.     swap    d3
  5929.     cmpi.b    #127,d3
  5930.     bhi    t_illegal_note_number
  5931.     move.b    d3,d4            *note set
  5932.     lsl.w    #4,d3
  5933.     andi.w    #$f000,d3
  5934.     or.w    d3,d4            *make address
  5935. @@:
  5936.     bsr    sc_p_set
  5937.     add.w    #$0100,d4
  5938.     addq.w    #1,a1
  5939.     dbra    d2,@b
  5940.     t_dat_ok
  5941.  
  5942. skip_peri:
  5943.     * < a0.l=filename addr
  5944. @@:
  5945.     cmpi.b    #'.',(a0)
  5946.     bne    @f
  5947.     addq.w    #1,a0
  5948.     bra    @b
  5949. @@:
  5950.     rts
  5951.  
  5952. clr_adpb?:
  5953.     * - all
  5954.     tst.b    adpb_clr-work(a6)
  5955.     beq    @f
  5956.     movem.l    d0/d3,-(sp)
  5957.     move.l    #ID_ZPD,d3
  5958.     jsr    free_mem2-work(a6)
  5959.     clr.b    adpb_clr-work(a6)
  5960.     movem.l    (sp)+,d0/d3
  5961. @@:
  5962.     rts
  5963.  
  5964.     .include    pcm_read.has
  5965.  
  5966. register_zpd:                *ADPCMブロックデータの取り込み
  5967.     *   cmd=$51
  5968.     * < a1.l=filename address
  5969.     * > d0.l=error code
  5970.     * > work:header_bufferにファイルのヘッダ情報が格納されている
  5971.                     *拡張子が無い時は'ZPD'を自動的に付ける
  5972.     move.l    filename(pc),a2
  5973.     moveq.l    #0,d0
  5974. rgzdlp00:
  5975.     move.b    (a1)+,d1
  5976.     move.b    d1,(a2)+
  5977.     beq    rgzd0
  5978.     cmpi.b    #'\',d1            *init.
  5979.     bne    @f
  5980.     moveq.l    #0,d0
  5981.     bra    rgzdlp00
  5982. @@:
  5983.     cmpi.b    #'/',d1            *init.
  5984.     bne    @f
  5985.     moveq.l    #0,d0
  5986.     bra    rgzdlp00
  5987. @@:
  5988.     cmp.b    #'.',d1
  5989.     bne    rgzdlp00
  5990.     move.l    a1,d0            *拡張子があるならばその位置をメモ
  5991.     bra    rgzdlp00
  5992. rgzd0:                    *PDXかどうか
  5993.     tst.l    d0
  5994.     beq    @f
  5995.     move.l    d0,a0
  5996.     move.b    (a0)+,d0        *拡張子が'PDX'かどうかをチェック
  5997.     bsr    mk_capital
  5998.     cmpi.b    #'P',d0
  5999.     bne    @f
  6000.     move.b    (a0)+,d0
  6001.     bsr    mk_capital
  6002.     cmpi.b    #'D',d0
  6003.     bne    @f
  6004.     move.b    (a0)+,d0
  6005.     bsr    mk_capital
  6006.     cmpi.b    #'X',d0
  6007.     beq    register_pdx
  6008. @@:
  6009.     move.l    filename(pc),a0
  6010.     lea    ZPD(pc),a1
  6011.     bsr    kakuchoshi
  6012.  
  6013.     bsr    read_abd        *>a2.l=read data addr.,> a3.l=last_fn
  6014.     tst.l    d0
  6015.     beq    @f
  6016.     rts                *case:error
  6017. @@:
  6018.     tst.l    d1
  6019.     beq    t_dat_ok2        *no read(case:d0=0)
  6020.     cmpi.w    #2,d1            *v2のZPDかどうか
  6021.     bhi    register_v3_zpd
  6022.     bsr    fn_to_lastfn        *ファイルネーム保存 * < a3.l=last_fn
  6023.     bra    set_adpcm_tbl_v2_
  6024. set_adpcm_tbl_v2:
  6025.     bsr    adpcm_tbl_init    *adpcm_tblの初期化
  6026. set_adpcm_tbl_v2_:
  6027.     * < a2.l=ZPD head addr.
  6028.     * x d0,d1,a2,a3,a4
  6029. abd_lp00:
  6030.     moveq.l    #0,d0
  6031.     move.w    (a2)+,d0
  6032.     move.w    d0,d3
  6033.     bpl    abd_note_case
  6034.     cmpi.w    #-1,d0
  6035.     beq    t_dat_ok    *all end
  6036.     andi.w    #$7fff,d0
  6037.     cmpi.w    #adpcm_reg_max-1,d0
  6038.     bhi    t_illegal_timbre_number
  6039.     cmp.w    adpcm_n_max2(pc),d0
  6040.     bcs    @f
  6041.     bsr    spread_adpcm_n2
  6042.     bmi    t_out_of_memory
  6043. @@:
  6044.     move.l    adpcm_tbl2(pc),a3
  6045.     bra    abd00
  6046. abd_note_case:
  6047.     cmpi.w    #adpcm_reg_max-1,d0
  6048.     bhi    t_illegal_tone_number
  6049.     cmp.w    adpcm_n_max(pc),d0
  6050.     bcs    @f
  6051.     bsr    spread_adpcm_n
  6052.     bmi    t_out_of_memory
  6053. @@:
  6054.     move.l    adpcm_tbl(pc),a3
  6055. abd00:
  6056.     lsl.l    #adpcm_tbl_size_,d0        *adpcm_tbl_size倍
  6057.     add.l    d0,a3        *ワークアドレス
  6058.     andi.w    #$7f,d3
  6059.     swap    d3
  6060.     clr.w    d3        *$00_nn_0000
  6061.     move.l    d3,(a3)+    *dummy attributes(初めは先頭を00にしておく)
  6062.     move.l    (a2)+,d1    *data address offset
  6063.     lea    (a2,d1.l),a4
  6064.     move.l    a4,(a3)+    *address
  6065.     move.l    (a2)+,d3
  6066.     move.l    d3,(a3)+    *size
  6067.     clr.l    (a3)+        *loop start
  6068.     subq.l    #1,d3        *point last data addr.
  6069.     move.l    d3,(a3)+    *loop end
  6070.     move.l    #1,(a3)+    *ループ1回
  6071.     clr.l    (a3)+        *reserved
  6072.     clr.l    (a3)+        *reserved
  6073.     clr.b    (a3)        *名前無し
  6074.     st.b    -32(a3)        *先頭バイトも$ffにしてデータを有効状態にする
  6075.     bra    abd_lp00
  6076.  
  6077. read_abd:
  6078.     * > d1.l=file type(0:no read, 2:v2.zpd, 3:v3.zpd)
  6079.     * > d4.l=true data size
  6080.     * > d6.l=date 
  6081.     * > a2.l=data addr.(=a0.l)
  6082.     * > a3.l=zpd_last_fn
  6083.     * > d0.l=0 no error
  6084.     * x d0,d1,d2,d3,d5,a0,a1,a3
  6085.     move.l    filename(pc),a2
  6086.     bsr    fopen        *(ret:d5=file handle)
  6087.     tst.l    d5        *d5=file_handle
  6088.     bmi    t_file_not_found    *read error
  6089.  
  6090.     lea    zpd_last_fn(pc),a3
  6091.     bsr    fname_chk
  6092.     bne    @f
  6093.     bsr    do_fclose
  6094.     clr.b    adpb_clr-work(a6)
  6095.     moveq.l    #0,d1
  6096.     moveq.l    #0,d0        *no error
  6097.     rts            *同じものは読まない
  6098. @@:
  6099.      bsr    get_fsize    *>d3.l=file size
  6100.     bmi    t_illegal_file_size
  6101.     subq.l    #8,d3        *header分減じる
  6102.     move.l    d3,d2        *d2=total data size(get mem時に使用)
  6103.     move.l    d2,d4        *データ読み込み時に使用
  6104.  
  6105.     lea    header_buffer(pc),a0
  6106.     move.w    sr,-(sp)
  6107.     andi.w    #$f8ff,sr
  6108.     move.l    #8,-(sp)    *push size(header size)
  6109.     move.l    a0,-(sp)    *push addr
  6110.     move.w    d5,-(sp)    *file handle
  6111.     DOS    _READ        *サンプリングデータの読み込み
  6112.     lea    10(sp),sp
  6113.     move.w    (sp)+,sr
  6114.     cmp.l    #8,d0
  6115.     bne    t_read_error
  6116.  
  6117.     cmpi.l    #ZPDV2_0,(a0)        *HEADER check(v2 zpd) $10,'ZmA'
  6118.     beq    @f            *zmusicには無縁のデータです
  6119.     cmpi.l    #ZPDV3_0,(a0)        *HEADER check(v3 zpd)
  6120.     bne    t_unidentified_file    *ID error
  6121.     cmpi.l    #ZPDV3_1,4(a0)        *ZmaDPcM
  6122.     bne    t_unidentified_file    *ID error
  6123.     moveq.l    #3,d1            *v3
  6124.     bra    ra_00
  6125. @@:
  6126.     cmpi.l    #ZPDV2_1,4(a0)    *$10,'ZmAdpCm' CASE
  6127.     bne    t_unidentified_file    *ID error
  6128.     moveq.l    #2,d1            *v2
  6129. ra_00:
  6130.     bsr    clr_adpb?
  6131.     move.l    #ID_ZPD,d3
  6132.     bsr    get_mem        *>a0.l=address,d2.l=lw border length
  6133.     tst.l    d0
  6134.     bmi    t_out_of_memory
  6135.     move.l    a0,a2
  6136.     clr.b    zpd_last_fn+30-work(a6)    *ファイル名バッファ除去
  6137. *    tst.b    adpb_clr-work(a6)
  6138. *    bne    @f
  6139. *    bsr    adpcm_tbl_init        *adpcm_tblの初期化
  6140. *@@:
  6141.     move.w    sr,-(sp)
  6142.     andi.w    #$f8ff,sr
  6143.     move.l    d4,-(sp)    *push size
  6144.     move.l    a2,-(sp)    *push addr
  6145.     move.w    d5,-(sp)    *file handle
  6146.     DOS    _READ        *サンプリングデータの読み込み
  6147.     lea    10(sp),sp
  6148.     move.w    (sp)+,sr
  6149.     cmp.l    d0,d4
  6150.     bne    t_read_error
  6151.  
  6152.     bsr    do_fclose
  6153.     move.l    a2,a0        *return value
  6154.     moveq.l    #0,d0        *no error
  6155.     rts
  6156.  
  6157. register_v3_zpd:            *ADPCMブロックデータの取り込み    *v3専用
  6158.     bsr    fn_to_lastfn        *ファイルネーム保存 * < a3.l=last_fn
  6159.     bra    set_adpcm_tbl_v3_
  6160. set_adpcm_tbl_v3:
  6161.     bsr    adpcm_tbl_init    *adpcm_tblの初期化
  6162. set_adpcm_tbl_v3_:
  6163.     * < a2.l=ZPD head addr.
  6164.     * d0,d1,a2,a3,a4
  6165.     addq.w    #4,a2        *skip dummy
  6166.     move.l    (a2)+,d2
  6167.     beq    t_dat_ok    *all end
  6168. abd_lp00_2:
  6169.     moveq.l    #0,d0
  6170.     move.w    (a2)+,d0
  6171.     bpl    abd_note_case_2
  6172.     andi.w    #$7fff,d0
  6173.     cmpi.w    #adpcm_reg_max-1,d0
  6174.     bhi    t_illegal_timbre_number
  6175.     cmp.w    adpcm_n_max2(pc),d0
  6176.     bcs    @f
  6177.     bsr    spread_adpcm_n2
  6178.     bmi    t_out_of_memory
  6179. @@:
  6180.     move.l    adpcm_tbl2(pc),a3
  6181.     bra    abd00_2
  6182. abd_note_case_2:
  6183.     cmpi.w    #adpcm_reg_max-1,d0
  6184.     bhi    t_illegal_tone_number
  6185.     cmp.w    adpcm_n_max(pc),d0
  6186.     bcs    @f
  6187.     bsr    spread_adpcm_n
  6188.     bmi    t_out_of_memory
  6189. @@:
  6190.     move.l    adpcm_tbl(pc),a3
  6191. abd00_2:
  6192.     lsl.l    #adpcm_tbl_size_,d0        *adpcm_tbl_size倍
  6193.     add.l    d0,a3        *ワークアドレス
  6194.     move.l    (a2)+,d0    *get attributes
  6195.     pea    (a3)
  6196.     clr.l    (a3)+        *とりあえずエリア無効にしておく
  6197.     move.l    (a2)+,d1
  6198.     lea    (a2,d1.l),a4
  6199.     move.l    a4,(a3)+    *address
  6200.     move.l    (a2)+,(a3)+    *size
  6201.     move.l    (a2)+,(a3)+    *loop start
  6202.     move.l    (a2)+,(a3)+    *loop end
  6203.     move.l    (a2)+,(a3)+    *loop time
  6204.     move.l    (a2)+,(a3)+    *reserved
  6205.     move.l    (a2)+,(a3)+    *reserved
  6206.     moveq.l    #adt_name_len-1,d1
  6207. @@:
  6208.     move.b    (a2)+,(a3)+    *tone name
  6209.     dbeq    d1,@b
  6210.  
  6211.     move.l    a2,d1        *even a2
  6212.     addq.l    #1,d1
  6213.     bclr.l    #0,d1
  6214.     move.l    d1,a2
  6215.  
  6216.     move.l    (sp)+,a3
  6217.     move.l    d0,(a3)        *アトリビュート設定
  6218.  
  6219.     subq.l    #1,d2
  6220.     bne    abd_lp00_2
  6221.     t_dat_ok
  6222.  
  6223. register_pdx:                *PDXの取り込み
  6224.     bsr    read_abd        *>a2.l=read data addr.,> a3.l=last_fn
  6225.     tst.l    d0
  6226.     beq    @f
  6227.     rts                *case:error
  6228. @@:
  6229.     tst.l    d1
  6230.     beq    t_dat_ok2        *no read(case:d0=0)
  6231.     cmpi.w    #2,d1            *v2のZPDかどうか
  6232.     bhi    register_v3_zpd
  6233.     bsr    fn_to_lastfn        *ファイルネーム保存 * < a3.l=last_fn
  6234.     bra    set_adpcm_tbl_pdx_
  6235. set_adpcm_tbl_pdx:
  6236.     bsr    adpcm_tbl_init        *adpcm_tblの初期化
  6237. set_adpcm_tbl_pdx_:
  6238.     * < a2.l=PDX head addr.
  6239.     move.w    adpcm_n_max(pc),d0    *96+16=112
  6240.     cmpi.w    #112,d0
  6241.     bcc    @f
  6242.     bsr    spread_adpcm_n
  6243.     bmi    t_out_of_memory
  6244. @@:
  6245.     move.l    a2,a1
  6246.     move.l    #15*adpcm_tbl_size,d0    *pdxはo0d+からだから15はそのオフセット
  6247.     moveq.l    #96-1,d2
  6248.     move.l    #15*65536,d5        *$00_nn_0000
  6249. pdx_lp00:
  6250.     move.l    (a1)+,d1    *offset for data
  6251.     beq    next_pdx
  6252.     move.l    adpcm_tbl(pc),a3
  6253.     add.l    d0,a3        *ワークアドレス
  6254.     move.l    d5,(a3)+    *dummy attributes(初めは先頭を00にしておく)
  6255.     lea    (a2,d1.l),a4
  6256.     move.l    a4,(a3)+    *address
  6257.     move.l    (a1)+,d3
  6258.     move.l    d3,(a3)+    *size
  6259.     clr.l    (a3)+        *loop start
  6260.     subq.l    #1,d3        *point last data addr.
  6261.     move.l    d3,(a3)+    *loop end
  6262.     move.l    #1,(a3)+    *ループ1回
  6263.     clr.l    (a3)+
  6264.     clr.l    (a3)+
  6265.     clr.b    (a3)        *名前無し
  6266.     st.b    -32(a3)        *先頭バイトも$ffにしてデータを有効状態にする
  6267. next_pdx:
  6268.     add.l    #$0001_0000,d5
  6269.     add.l    #adpcm_tbl_size,d0
  6270.     dbra    d2,pdx_lp00
  6271.     t_dat_ok
  6272.  
  6273. set_zpd_table:            *ZPDデータのテーブルセット    !v3
  6274.     *   cmd=$52
  6275.     * < d1.l=version type(0:V1~2,1:V3,2:PDX)
  6276.     * < a1.l=data address (ヘッダの次から)
  6277.     * > d0.l=error code
  6278.     movea.l    a1,a2
  6279. set_zpd_tbl_:
  6280.     clr.b    zpd_last_fn+30-work(a6)
  6281.     subq.w    #1,d1
  6282.     bmi    set_adpcm_tbl_v2_    *v2 case
  6283.     beq    set_adpcm_tbl_v3_    *v3 case
  6284.     subq.w    #1,d1
  6285.     beq    set_adpcm_tbl_pdx_
  6286.     bra    t_unidentified_file
  6287.  
  6288. clr_wvmm?:            *波形メモリバッファの管理
  6289.     * - all
  6290.     tst.b    wvmm_clr-work(a6)
  6291.     beq    @f
  6292.     movem.l    d0/d3,-(sp)
  6293.     move.l    #ID_WAVE,d3
  6294.     jsr    free_mem2-work(a6)
  6295. *    bsr    wave_tbl_init
  6296.     clr.b    wvmm_clr-work(a6)
  6297.     movem.l    (sp)+,d0/d3
  6298. @@:
  6299.     rts
  6300.  
  6301. spread_wave_n:                *波形メモリ管理テーブル
  6302. reglist    reg    d0-d4/a0-a1
  6303.     * < d1.w=0~32767-8
  6304.     * - all
  6305.     movem.l    reglist,-(sp)
  6306.     ext.l    d1
  6307.     addq.l    #8,d1            *上限拡張
  6308.     cmpi.l    #wv_reg_max,d1
  6309.     bls    @f
  6310.     move.l    #wv_reg_max,d1
  6311. @@:
  6312.     move.l    d1,d4            *new n-max
  6313.     lsl.l    #wv_tbl_size_,d1
  6314.     move.l    d1,d2            *require size
  6315.     moveq.l    #0,d3
  6316.     move.w    wave_n_max(pc),d3
  6317.     bne    enlrg_wvtb
  6318.     move.l    #ID_WAVE_TBL,d3        *ID
  6319.     bsr    get_mem
  6320.     tst.l    d0
  6321.     bmi    err_exit_spadt
  6322.     move.l    a0,wave_tbl-work(a6)
  6323.     move.w    d4,wave_n_max-work(a6)
  6324.     bsr    wave_tbl_init
  6325.     moveq.l    #0,d0            *no error
  6326.     movem.l    (sp)+,reglist
  6327.     rts
  6328. enlrg_wvtb:
  6329.     move.l    wave_tbl(pc),a1        *enlarge or get?(adpcm_tbl)
  6330.     bsr    enlarge_mem
  6331.     tst.l    d0
  6332.     bmi    err_exit_spwvt
  6333.     move.l    a0,wave_tbl-work(a6)
  6334.     move.w    d4,wave_n_max-work(a6)
  6335.     sub.w    d3,d4
  6336.     lsl.l    #wv_tbl_size_,d3
  6337.     add.l    d3,a0
  6338.     subq.w    #1,d4            *for dbra
  6339. @@:
  6340.     bsr    do_init_wvtbl
  6341.     dbra    d4,@b
  6342.     moveq.l    #0,d0
  6343.     movem.l    (sp)+,reglist
  6344.     rts
  6345. err_exit_spwvt:                *メモリ不足エラー
  6346.     moveq.l    #-1,d0
  6347.     movem.l    (sp)+,reglist
  6348.     rts
  6349.  
  6350. convert_pcm:            *PCMデータの変換
  6351.     *   cmd=$53
  6352.     * < d1.l=mode(0:adpcm to pcm,1:pcm to adpcm)
  6353.     * < d2.l=size(変換元のデータサイズ)
  6354.     * < a1.l=src data address
  6355.     * < a2.l=dest data address
  6356.     * > none
  6357.     move.l    d2,d0            *size
  6358.     tst.l    d1            *check mode
  6359.     beq    @f
  6360.     move.l    a2,a0            *a0=dest:adpcm buffer
  6361.     bra    pcm_to_adpcm        *a1=src:pcm buffer
  6362. @@:
  6363.     move.l    a1,a0            *a0=src:adpcm buffer
  6364.     move.l    a2,a1            *a1=dest:pcm buffer
  6365.     bra    just_adpcm_to_pcm
  6366.  
  6367. exec_subfile:            *サブファイルの読み込みと実行
  6368.     *   cmd=$54
  6369.     * < a1=filename文字列(endcode=0)
  6370.     * > d0.l=error code
  6371.     move.l    a1,a2        *a2=filename文字列
  6372.     lea    CNF(pc),a1    *拡張子
  6373. *    lea    cnf_last_fn(pc),a3
  6374. *    clr.b    (a3)        *ファンクションで呼ばれた場合はキャッシュ処理なし
  6375.     lea    exec_comn_cmd(pc),a5
  6376. exec_subfile0:
  6377.     bsr    read_subfile    *>a1 address, d3 size
  6378.     tst.l    d0
  6379.     beq    do_exec_subfile
  6380.     rts            *読み込み失敗
  6381. do_exec_subfile:
  6382.     * < a1.l=address
  6383.     * < d3.l=size
  6384.     * - a1-a2
  6385. reglist    reg    a1-a2
  6386.     movem.l    reglist,-(sp)
  6387.                     *コンパイルデータの実行(ここを変えたらexec_cmpも変える)
  6388.     cmpi.l    #ZmuSiC0,(a1)        *$10,'Zmu'
  6389.     bne    isitzpd?
  6390.     cmpi.l    #ZmuSiC1+v_code,4(a1)    *'Sic',version(.b)
  6391.     bne    go_subcnv
  6392.     lea    8(a1),a2        *address(header分足す)
  6393.     jsr    (a5)
  6394. exit_cmnrdcnf:                *メモリを解放して終了
  6395.     movem.l    (sp)+,reglist
  6396.     bra    free_mem
  6397.  
  6398. isitzpd?:                *ZPDのケースか(V2)
  6399.     cmpi.l    #ZPDV2_0,(a1)        *$10,'ZmA'
  6400.     bne    isitv3zpd?
  6401.     cmpi.l    #ZPDV2_1,4(a1)    *'dpCm'
  6402.     bne    go_subcnv
  6403.  
  6404.     lea    8(a1),a2        *addr
  6405.     move.l    d3,d2            *size
  6406.     subq.l    #8,d2            *headerの長さ分差し引く
  6407.     ble    exit_cmnrdcnf        *minus or zero
  6408.     clr.b    zpd_last_fn+30-work(a6)    *ファイルネームキャッシュ無効化
  6409.     clr.b    adpb_clr-work(a6)    *初期化不要
  6410.     bsr    set_adpcm_tbl_v2    *ブロックデータのインフォメーションをワークにセット
  6411. exit_isitzpd:
  6412.     movem.l    (sp)+,reglist
  6413.     move.l    #0,d1            *no check
  6414.     move.l    #ID_ZPD,d3
  6415.     bra    exchange_memid
  6416.  
  6417. isitv3zpd?:                *ZPDのケースか(V3)
  6418.     cmpi.l    #ZPDV3_0,(a1)        *$10,'Zma'
  6419.     bne    isitsmf?
  6420.     cmpi.l    #ZPDV3_1,4(a1)        *'DPcM'
  6421.     bne    match_err
  6422.  
  6423.     lea    8(a1),a2        *addr
  6424.     move.l    d3,d2            *size
  6425.     subq.l    #8,d2            *headerの長さ分差し引く
  6426.     ble    exit_cmnrdcnf        *minus or zero
  6427.     clr.b    zpd_last_fn+30-work(a6)    *ファイルネームキャッシュ無効化
  6428.     clr.b    adpb_clr-work(a6)    *初期化不要
  6429.     bsr    set_adpcm_tbl_v3    *ブロックデータのインフォメーションをワークにセット
  6430.     bra    exit_isitzpd
  6431.  
  6432. isitsmf?:                *バイナリMIDIダンプデータ(MID)送信
  6433.     cmpi.l    #SMFHED,(a1)        *'MThd'
  6434.     bne    go_subcnv
  6435. *    clr.b    mbd_last_fn-work(a6)    *ファイルネームキャッシュ無効化
  6436.     move.l    d3,d2
  6437.     bsr    midi_transmission
  6438.     bra    exit_cmnrdcnf
  6439.  
  6440. go_subcnv:
  6441.     * < a1.l=address
  6442.     * < d3.l=size
  6443.     move.l    compiler_j(pc),a0        *compilerファンクションが有効か(d0=fnc addr)
  6444.     move.l    a0,d0
  6445.     beq    gs_t_cannot_compile
  6446.     move.l    #1,d1            *no header,no err list,errmax=1
  6447.     move.l    d3,d2            *size
  6448.                     *< a1=addr,d2=size
  6449.     movem.l    d1-d7/a1-a6,-(sp)
  6450.     jsr    (a0)            *go compiler fnc
  6451.     movem.l    (sp)+,d1-d7/a1-a6
  6452.     tst.l    d0            *> d0=error, a0=error tbl addr(if required)
  6453.     bne    gs_t_compile_error    *コンパイル失敗
  6454.     move.l    a0,-(sp)
  6455.     move.l    a0,a2            *a0=OBJ addr(case:no error)
  6456.     lea    z_comn_offset(a2),a2
  6457.     move.l    (a2)+,d0
  6458.     beq    @f
  6459.     add.l    d0,a2
  6460.     jsr    (a5)            *共通コマンド実行 < a2.l=zmd addr.
  6461. @@:
  6462.     move.l    (sp)+,a1
  6463.     bsr    free_mem        *オブジェクト領域を解放
  6464.     movem.l    (sp)+,reglist
  6465.     bra    free_mem        *読み込んだソースを破棄して終了
  6466. gs_t_cannot_compile:
  6467.     movem.l    (sp)+,reglist
  6468.     bra    t_compiler_not_available
  6469. gs_t_compile_error:
  6470.     movem.l    (sp)+,reglist
  6471.     bra    t_compile_error
  6472.  
  6473. read_subfile:            *サブファイル読み込み
  6474.     * < a1.l=拡張子
  6475.     * < a2.l=filename
  6476.     * < a3.l=last fn buffer
  6477.     * > d0.l=0 no error
  6478.     * > a1.l=data address
  6479.     * > d3.l=size
  6480.     * > a2=next
  6481.     move.l    filename(pc),a0
  6482. @@:
  6483.     move.b    (a2)+,(a0)+
  6484.     bne    @b
  6485.     move.l    a2,-(sp)
  6486.     move.l    filename(pc),a0
  6487.     bsr    kakuchoshi
  6488.  
  6489.     move.l    filename(pc),a2
  6490.     bsr    fopen        *環境変数対応
  6491.     tst.l    d5        *d5=file_handle
  6492.     bmi    rs_t_file_not_found
  6493.  
  6494. *    bsr    fname_chk    * < a3.l=last_fn
  6495. *    bne    @f
  6496. *    bsr    do_fclose
  6497. *    bra    exit_rdsb
  6498. *@@:
  6499.     bsr    get_fsize    *>d3.l=file size
  6500.     bmi    rs_t_illegal_file_size
  6501.  
  6502.     move.l    d3,d2
  6503.     bsr    get_temp_buf    *>a1.l=data address(d2サイズ分使い捨てバッファを確保)
  6504.     bmi    rs_t_out_of_memory
  6505.     bsr    so_read
  6506. *    bsr    fn_to_lastfn    * < a3.l=last_fn
  6507. exit_rdsb:
  6508.     move.l    (sp)+,a2
  6509.     moveq.l    #0,d0        *ok
  6510.     rts
  6511.  
  6512. rs_t_file_not_found:
  6513.     move.l    (sp)+,a2
  6514.     bra    t_file_not_found
  6515.  
  6516. rs_t_illegal_file_size:
  6517.     move.l    (sp)+,a2
  6518.     bra    t_illegal_file_size
  6519.  
  6520. rs_t_out_of_memory:
  6521.     move.l    (sp)+,a2
  6522.     bra    t_out_of_memory
  6523.  
  6524. fn_to_lastfn:            *読み込んだファイルの情報保存
  6525.     * < a3.l=last fn addr
  6526.     * - all
  6527.     movem.l    d0/a1/a3,-(sp)
  6528.     lea.l    file_info_buf(pc),a1
  6529.     moveq.l    #53-1,d0
  6530. @@:
  6531.     move.b    (a1)+,(a3)+
  6532.     dbra    d0,@b
  6533.     movem.l    (sp)+,d0/a1/a3
  6534.     rts
  6535.  
  6536. so_read:
  6537.     * < d3.l=size
  6538.     * < a1.l=address
  6539.     * < d5.l=file handle
  6540.     * - all except d0
  6541.     move.w    sr,-(sp)
  6542.     andi.w    #$f8ff,sr
  6543.     move.l    d3,-(sp)    *push size
  6544.     move.l    a1,-(sp)    *push addr
  6545.     move.w    d5,-(sp)    *file handle
  6546.     DOS    _READ        *サンプリングデータの読み込み
  6547.     lea    10(sp),sp
  6548.     move.w    (sp)+,sr
  6549.     bra    do_fclose
  6550.  
  6551. transmit_midi_dump:            *MIDIダンプファイルの転送
  6552.     *   cmd=$55
  6553.     * < d1.w=midi port number(0~2),-1はカレント
  6554.     * < a1.l=filename文字列(endcode=0)
  6555.     * > d0.l=error code
  6556.     move.l    a1,a2
  6557. transmit_midi_dump0:            *< a2.l=filename
  6558.     bsr    current_midi_out    *一時的に設定する
  6559.     move.w    d0,-(sp)
  6560.     lea    MDD(pc),a1        *拡張子
  6561. *    lea    mbd_last_fn(pc),a3
  6562.     bsr    read_subfile        *>a1 address, d3 size*
  6563.     tst.l    d0
  6564.     bne    t_read_error
  6565.     move.l    d3,d2
  6566.     cmpi.l    #SMFHED,(a1)
  6567.     beq    @f
  6568.     cmpi.b    #$1a,-1(a1,d3.l)
  6569.     bne    t_unidentified_file    *endcodeがない
  6570.     moveq.l    #0,d2            *dummy size
  6571. @@:
  6572.     bsr    midi_transmission
  6573.     move.w    (sp)+,d1        *元に戻す
  6574.     bsr    current_midi_out
  6575.     bra    free_mem        *使い捨て領域解放&帰還
  6576.  
  6577. set_wave_form1:                    *波形データ登録(データ転送有り)
  6578.     *   cmd=$56                *v3済み
  6579.     * < a1.l=data address
  6580.     * < d1.w=wave number
  6581.     * < 0(a1).l=data size
  6582.     * < 4(a1).b=loop type
  6583.     * < 5(a1).l=loop start offset
  6584.     * < 9(a1).l=loop end offset
  6585.     * < 13(a1).l=loop time(0=∞)
  6586.     * < 17(a1).l reserved area
  6587.     * < 21(a1).b name len 
  6588.     * < 22(a1)~ name
  6589.     * < 22+name len(a1)~ data(ただし偶数アドレスから始まっている)
  6590.     * > d0.l=0 no error
  6591.     bsr    clr_wvmm?            *波形メモリバッファの管理
  6592.     ext.l    d1
  6593.     subq.w    #wv_def_max,d1
  6594.     cmpi.l    #wv_reg_max-1,d1
  6595.     bhi    t_illegal_wave_number
  6596.     cmp.w    wave_n_max(pc),d1
  6597.     bcs    @f
  6598.     bsr    spread_wave_n
  6599.     bmi    t_out_of_memory
  6600. @@:
  6601.     lsl.l    #wv_tbl_size_,d1
  6602.     move.l    wave_tbl(pc),a4
  6603.     adda.w    d1,a4                *管理テーブルのアドレス
  6604.  
  6605.     move.l    a1,a5
  6606.     move.l    (a1),d2                *size
  6607.     moveq.l    #0,d4
  6608.     move.b    21(a1),d4            *str len
  6609.     add.l    d4,d2                *文字列サイズ
  6610.     move.l    wave_memory_top(pc),d0
  6611.     bne    enlarge_wvmm
  6612.     move.l    #ID_WAVE,d3
  6613.     bsr    get_mem                *a0.l=address,d2.l=long word border size
  6614.     tst.l    d0
  6615.     bmi    t_out_of_memory
  6616.     move.l    a0,wave_memory_top-work(a6)
  6617.     move.l    d2,wave_memory_size-work(a6)
  6618.     lea    (a0,d2.l),a1
  6619.     move.l    a1,wave_memory_end-work(a6)
  6620.     bra    swf1_00
  6621. enlarge_wvmm:
  6622.     move.l    d0,a1
  6623.     add.l    wave_memory_size(pc),d2
  6624.     bsr    enlarge_mem
  6625.     tst.l    d0
  6626.     bmi    t_out_of_memory
  6627.     movem.l    d0-d3/a1,-(sp)            *テーブルの辻褄会わせ
  6628.     move.w    wave_n_max(pc),d0
  6629.     subq.w    #1,d0                *for dbra
  6630.     bcs    exit_enlgwvm
  6631.     move.l    wave_tbl(pc),a1
  6632.     move.l    a0,d2
  6633.     move.l    wave_memory_top(pc),d1
  6634.     move.l    d1,d3
  6635.     sub.l    d1,d2                *新領域までのオフセット
  6636.     add.l    wave_memory_size(pc),d1        *旧領域の最終アドレス
  6637. enlgwvmlp00:
  6638.     cmp.l    wave_start_addr(a1),d3
  6639.     bhi    @f
  6640.     cmp.l    wave_start_addr(a1),d1
  6641.     bcs    @f
  6642.     add.l    d2,wave_start_addr(a1)
  6643.     add.l    d2,wave_end_addr(a1)
  6644.     add.l    d2,wave_loop_start(a1)
  6645.     add.l    d2,wave_loop_end(a1)
  6646.     add.l    d2,wave_name_addr(a1)
  6647. @@:
  6648.     lea    wv_tbl_size(a1),a1
  6649.     dbra    d0,enlgwvmlp00
  6650. exit_enlgwvm:
  6651.     movem.l    (sp)+,d0-d3/a1
  6652.     move.l    a0,wave_memory_top-work(a6)
  6653.     move.l    d2,wave_memory_size-work(a6)
  6654.     lea    (a0,d2.l),a1
  6655.     move.l    wave_memory_end(pc),a0
  6656.     move.l    a1,wave_memory_end-work(a6)
  6657. swf1_00:
  6658.     move.l    d4,d0            *< d4.l=文字長
  6659.     move.l    a0,a1            *a1=もらった領域の先頭アドレス(文字列が格納される)
  6660.     add.l    a0,d0
  6661.     addq.l    #1,d0
  6662.     bclr.l    #0,d0            *.even
  6663.     move.l    d0,a0            *a0=波形が格納されるアドレス
  6664.     move.l    a0,(a4)+        *data address    p_wvXm_point
  6665.     move.b    (a5)+,d0        *get size H
  6666.     lsl.w    #8,d0
  6667.     move.b    (a5)+,d0
  6668.     swap    d0
  6669.     move.b    (a5)+,d0        *get size L
  6670.     lsl.w    #8,d0
  6671.     move.b    (a5)+,d0
  6672.     add.l    a0,d0
  6673.     move.l    d0,(a4)+        *end address+2    p_wvXm_end
  6674.     addq.w    #1,a4            *reserved
  6675.     move.b    (a5)+,d0
  6676.     subq.b    #1,d0            *0-2→-1,0,+1
  6677.     move.b    d0,(a4)+        *loop type    p_wvXm_lpmd
  6678.     move.b    (a5)+,d0        *get loop start H
  6679.     lsl.w    #8,d0
  6680.     move.b    (a5)+,d0
  6681.     swap    d0
  6682.     move.b    (a5)+,d0        *get loop start L
  6683.     lsl.w    #8,d0
  6684.     move.b    (a5)+,d0
  6685.     add.l    a0,d0
  6686.     move.l    d0,(a4)+        *set loop start address    p_wvXm_lpst
  6687.     move.b    (a5)+,d0        *get loop end H
  6688.     lsl.w    #8,d0
  6689.     move.b    (a5)+,d0
  6690.     swap    d0
  6691.     move.b    (a5)+,d0        *get loop end L
  6692.     lsl.w    #8,d0
  6693.     move.b    (a5)+,d0
  6694.     add.l    a0,d0
  6695.     move.l    d0,(a4)+        *loop end address    p_wvXm_lped
  6696.     rept    4
  6697.     move.b    (a5)+,(a4)+        *loop time        p_wvXm_lptm
  6698.     endm
  6699.     addq.w    #4,a5            *reserved area
  6700.     add.w    #5,a4            *reserved area
  6701.     move.b    (a5)+,(a4)+        *str len
  6702.     move.l    a1,(a4)+        *str addr
  6703.     subq.w    #1,d2
  6704.     bcs    cp_data_wvst        *文字なしの場合はスキップ
  6705. @@:                    *文字列コピー
  6706.     move.b    (a5)+,(a1)+
  6707.     dbra    d2,@b
  6708. cp_data_wvst:
  6709.     move.l    d5,d0
  6710.     addq.l    #1,d0
  6711.     bclr.l    #0,d0            *.even
  6712.     move.l    d0,a5
  6713. @@:
  6714.     move.w    (a5)+,(a0)+            *データ部転送
  6715.     subq.w    #2,d2
  6716.     bne    @b
  6717.     move.l    a5,a0                *next addr(return value)
  6718.     t_dat_ok
  6719.  
  6720. set_wave_form2:                    *波形データ登録(データ転送なし)
  6721.     *   cmd=$57                *v3済み
  6722.     * < a1.l=data address
  6723.     * < d1.w=wave number
  6724.     * < 0(a1).l=data size
  6725.     * < 4(a1).b=loop type
  6726.     * < 5(a1).l=loop start offset
  6727.     * < 9(a1).l=loop end offset
  6728.     * < 13(a1).l=loop time(0=∞)
  6729.     * < 17(a1).l reserved area
  6730.     * < 21(a1).b name len 
  6731.     * < 22(a1)~ name
  6732.     * < 22+name len(a1)~ data(ただし偶数アドレスから始まっている)
  6733.     * > d0.l=0 no error
  6734.     * > a0.l next addr
  6735.     bsr    clr_wvmm?        *波形メモリバッファの管理
  6736.     ext.l    d1
  6737.     subq.w    #wv_def_max,d1
  6738.     cmpi.l    #wv_reg_max-1,d1
  6739.     bhi    t_illegal_wave_number
  6740.     cmp.w    wave_n_max(pc),d1
  6741.     bcs    @f
  6742.     bsr    spread_wave_n
  6743.     bmi    t_out_of_memory
  6744. @@:
  6745.     lsl.l    #wv_tbl_size_,d1
  6746.     move.l    wave_tbl(pc),a4
  6747.     add.l    d1,a4
  6748.     lea    22(a1),a0        *a0=文字列格納アドレス
  6749.     moveq.l    #0,d0
  6750.     move.b    21(a1),d0        *d0.l=string len
  6751.     lea    22(a1,d0.w),a2
  6752.     move.l    a2,d0
  6753.     addq.l    #1,d0
  6754.     bclr.l    #0,d0            *.even
  6755.     move.l    d0,a2            *a2=波形データ格納アドレス
  6756.  
  6757.     move.l    a2,(a4)+        *data addr    p_wvXm_point
  6758.     move.b    (a1)+,d0        *get size H
  6759.     lsl.w    #8,d0
  6760.     move.b    (a1)+,d0
  6761.     swap    d0
  6762.     move.b    (a1)+,d0        *get size L
  6763.     lsl.w    #8,d0
  6764.     move.b    (a1)+,d0
  6765.     add.l    a2,d0
  6766.     move.l    d0,-(sp)
  6767.     move.l    d0,(a4)+        *end addr    p_wvXm_end
  6768.     addq.w    #1,a4            *reserved
  6769.     move.b    (a1)+,d0
  6770.     subq.b    #1,d0            *0-2→-1,0,+1
  6771.     move.b    d0,(a4)+        *type        p_wvXm_lpmd
  6772.     move.b    (a1)+,d0        *get loop start H
  6773.     lsl.w    #8,d0
  6774.     move.b    (a1)+,d0
  6775.     swap    d0
  6776.     move.b    (a1)+,d0        *get loop start L
  6777.     lsl.w    #8,d0
  6778.     move.b    (a1)+,d0
  6779.     add.l    a2,d0
  6780.     move.l    d0,(a4)+        *loop start offset    p_wvXm_lpst
  6781.     move.b    (a1)+,d0        *get loop end H
  6782.     lsl.w    #8,d0
  6783.     move.b    (a1)+,d0
  6784.     swap    d0
  6785.     move.b    (a1)+,d0        *get loop end L
  6786.     lsl.w    #8,d0
  6787.     move.b    (a1)+,d0
  6788.     add.l    a2,d0
  6789.     move.l    d0,(a4)+        *loop end offset    p_wvXm_lped
  6790.     rept    4
  6791.     move.b    (a1)+,(a4)+        *loop time        p_wvXm_lptm
  6792.     endm
  6793.     addq.w    #4,a1            *reserved area
  6794.     add.w    #5,a4            *reserved area
  6795.     move.b    (a1)+,(a4)+        *str len
  6796.     move.l    a0,(a4)+        *str addr
  6797.     move.l    (sp)+,a0        *next addr (return value)
  6798.     t_dat_ok
  6799.  
  6800. obtain_events:            *各種イベントの取得
  6801.     *   cmd=$58
  6802.     * < a1.l=destination address table
  6803.     * < d1.w=omit flag (d0:m_play,d1:m_stop,d2:m_cont...
  6804.     *            bit:1=do parameter set    bit:0=omit parameter setting)
  6805.     *   00(a1).l    0:m_play(0:off)
  6806.     *   04(a1).l    1:m_stop(0:off)
  6807.     *   08(a1).l    2:m_cont(0:off)
  6808.     *   0c(a1).l    3:Jump after if performance comes to an end.(0:off)
  6809.     *   10(a1).l    4:Loop time value(0:off/1-256)上位16ビットは0に初期化しておくこと
  6810.     *   14(a1).l    5:Jump after n times loop
  6811.     *   18(a1).l    6:Clock value(0:off)
  6812.     *   1c(a1).l    7:Jump after n clocks
  6813.     * > a0.l=イベントテーブルアドレス
  6814.     *
  6815.     * < a1.l=-1 ask mode
  6816.     * > a0.l=イベントテーブルアドレス
  6817.     ori.w    #$700,sr
  6818.     cmp.l    #-1,a1
  6819.     beq    obtevt_ask
  6820.     lea    obtevtjtbl(pc),a2
  6821.     moveq.l    #obtevtjtblsize/4-1,d0
  6822. obtevtlp:                    *パラメータ転送
  6823.     lsr.w    #1,d1
  6824.     bcc    @f
  6825.     move.l    (a1)+,(a2)
  6826. @@:
  6827.     addq.w    #4,a2
  6828.     tst.w    d1
  6829.     beq    @f                *まだ設定するモノがあるか
  6830.     dbra    d0,obtevtlp
  6831. @@:
  6832.     move.w    trk_n_max(pc),d0
  6833.     beq    skip_clr_dnbt
  6834.     lsr.w    #5,d0                */32
  6835.     move.l    done_bit(pc),a0
  6836. @@:
  6837.     clr.l    (a0)+
  6838.     dbra    d0,@b
  6839. skip_clr_dnbt:
  6840.     tst.l    obtevtjtbl-work+nc_clock(a6)
  6841.     beq    @f
  6842.     clr.l    zmusic_int-work(a6)        *クロックジャンプ指定なので関連ワーク初期化
  6843.     patch_l    BSR,inc_zmint,check_nc_clock
  6844.     bra    1f
  6845. @@:
  6846.     move.l    zi_inst(pc),inc_zmint-work(a6)
  6847. 1:
  6848.     bsr    cache_flush
  6849. obtevt_ask:
  6850.     lea    obtevtjtbl(pc),a0
  6851.     rts
  6852.  
  6853. mp_jump:    equ    0    *.l
  6854. ms_jump:    equ    4    *.l
  6855. mc_jump:    equ    8    *.l
  6856. ed_jump:    equ    12    *.l
  6857. lp_work:    equ    16    *規定回数ループしたトラックの数(.w)
  6858. lp_loop:    equ    18    *指定ループ回数(.w)チェックには下位バイトのみ使用する
  6859. lp_jump:    equ    20    *.l
  6860. nc_clock:    equ    24    *.l
  6861. nc_jump:    equ    28    *.l
  6862. obtevtjtblsize:    equ    32
  6863. obtevtjtbl:    ds.b    obtevtjtblsize
  6864. zi_inst:    ds.l    1
  6865.  
  6866. loop_control:            *演奏トラック全体のループ回数を得る
  6867.     *   cmd=$59
  6868.     * < d1.l=control mode(-1:ask loop time,0:normal loop mode,1:ignore loop)
  6869.     * > d0.l=loop time(-1:error)
  6870.     tst.l    d1
  6871.     beq    lpctrl00
  6872.     bpl    lpctrl01
  6873. get_lptm:
  6874.     move.l    play_trk_tbl(pc),a0
  6875.     moveq.l    #-1,d0
  6876.     moveq.l    #0,d1
  6877. glt_lp:
  6878.     moveq.l    #0,d3
  6879.     move.w    (a0)+,d3
  6880.     cmpi.w    #-1,d3
  6881.     beq    exit_glt
  6882.     calc_wk    d3
  6883. *    tst.b    p_track_stat(a5)
  6884. *    bne    glt_lp
  6885.     moveq.l    #0,d3
  6886.     move.b    p_do_loop_flag(a5),d3
  6887.     tst.b    d1
  6888.     beq    @f
  6889.     cmp.b    d0,d3
  6890.     bcc    glt_lp
  6891. @@:
  6892.     move.l    d3,d0
  6893.     st.b    d1
  6894.     bra    glt_lp
  6895. exit_glt:
  6896.     tst.l    d0
  6897.     bne    @f
  6898.     moveq.l    #1,d0
  6899. @@:
  6900.     rts
  6901.  
  6902. lpctrl00:        *ループモードを通常へ
  6903.     bclr.b    #7,perform_flg-work(a6)
  6904.     bra    get_lptm
  6905.  
  6906. lpctrl01:        *ループモードを「ループ禁止」モードへ
  6907.     tas.b    perform_flg-work(a6)
  6908.     bra    get_lptm
  6909.  
  6910. mask_tracks:                *v3
  6911.     *   cmd=$5a
  6912.     * < a1.l=parameter table
  6913.     * <      param. sequence
  6914.     *        {track number(.w),mask mode(.w),...,-1.w}
  6915.     *        track number:(0-65534)(.w)
  6916.     *        mask mode 0.w:enable
  6917.     *              1.w:reverse
  6918.     *             -1.w:disable
  6919.     *        end code:-1.w
  6920.     * < a1.l=0        all tracks
  6921.     * < d1.w=0        enable
  6922.     * < d1.w=+1        reverse
  6923.     * < d1.w=-1        mask
  6924.     *
  6925.     * < a1.l=1        SOLO mode
  6926.     * < d1.w=0-65534    track numbers
  6927.     *
  6928.     * > (a0)        設定できなかったトラック番号の並び
  6929.     *            -1=end code
  6930.     * > next addr(case:< a1.l<>0)
  6931.     move.l    mask_track_result(pc),a0
  6932.     move.w    #-1,(a0)
  6933.     ori.w    #$700,sr        *割り込み禁止
  6934.     move.l    a1,d0
  6935.     beq    msktr_all_tr        *全トラックへの操作
  6936.     subq.l    #1,d0
  6937.     beq    solo_tr            *ソロ
  6938. trmsklp00:
  6939.     move.w    (a1)+,d0        *tr=0-65534
  6940.     cmpi.w    #-1,d0
  6941.     beq    t_dat_ok
  6942.     * < d0=track number(0-65534)
  6943.     * eq:no error
  6944.     * mi:error    -2(a1) will be updated.
  6945.     * x d1,a2
  6946.     move.l    play_trk_tbl(pc),a2
  6947. @@:
  6948.     moveq.l    #0,d1
  6949.     move.w    (a2)+,d1
  6950.     cmpi.w    #-1,d1
  6951.     beq    err_msktr
  6952.     cmp.w    d1,d0
  6953.     bne    @b
  6954.     calc_wk    d1
  6955.     move.w    (a1)+,d2
  6956.     beq    msktr_enable        *マスク解除
  6957.     bmi    msktr_mask        *マスク設定
  6958.                     *マスク反転のケース
  6959.     not.b    p_mask_mode(a5)
  6960.     beq    1f
  6961.     bra    @f
  6962. msktr_mask:                *マスク設定
  6963.     st.b    p_mask_mode(a5)
  6964. @@:
  6965.     move.l    p_type(a5),d4
  6966.     bsr    _ms_key_off
  6967.     bra    trmsklp00
  6968. msktr_enable:                *マスク解除
  6969.     clr.b    p_mask_mode(a5)
  6970. 1:
  6971.     tst.w    p_type(a5)
  6972.     bne    trmsklp00
  6973.     move.w    p_ch(a5),d4        *FMのみ音色再設定処理
  6974.     bsr    restore_af
  6975.     bra    trmsklp00
  6976. err_msktr:                *エラー
  6977.     move.w    d0,(a0)+
  6978.     move.w    #-1,(a0)
  6979.     addq.w    #2,a1            *skip mode
  6980.     bra    trmsklp00
  6981.  
  6982. msktr_all_tr:                *全トラック操作
  6983.     move.l    play_trk_tbl(pc),a1
  6984.     tst.w    d1
  6985.     beq    msktr_all_enable
  6986.     bmi    msktr_all_mask
  6987. *msktr_all_reverse:            *全トラックマスク反転
  6988. @@:
  6989.     moveq.l    #0,d0
  6990.     move.w    (a1)+,d0
  6991.     cmpi.w    #-1,d0
  6992.     beq    t_dat_ok
  6993.     calc_wk    d0
  6994.     not.b    p_mask_mode(a5)
  6995.     beq    1f
  6996.     move.l    p_type(a5),d4
  6997.     bsr    _ms_key_off
  6998.     bra    @b
  6999. 1:
  7000.     tst.w    p_type(a5)
  7001.     bne    @b
  7002.     move.w    p_ch(a5),d4        *FMのみ音色再設定処理
  7003.     bsr    restore_af
  7004.     bra    @b
  7005.  
  7006. msktr_all_enable:            *全トラックマスク解除
  7007. @@:
  7008.     moveq.l    #0,d0
  7009.     move.w    (a1)+,d0
  7010.     cmpi.w    #-1,d0
  7011.     beq    t_dat_ok
  7012.     calc_wk    d0
  7013.     clr.b    p_mask_mode(a5)
  7014.     tst.w    p_type(a5)
  7015.     bne    @b
  7016.     move.w    p_ch(a5),d4        *FMのみ音色再設定処理
  7017.     bsr    restore_af
  7018.     bra    @b
  7019.  
  7020. msktr_all_mask:                *全トラックマスク設定
  7021. @@:
  7022.     moveq.l    #0,d0
  7023.     move.w    (a1)+,d0
  7024.     cmpi.w    #-1,d0
  7025.     beq    t_dat_ok
  7026.     calc_wk    d0
  7027.     st.b    p_mask_mode(a5)
  7028.     move.l    p_type(a5),d4
  7029.     bsr    _ms_key_off
  7030.     bra    @b
  7031.  
  7032. solo_tr:                *全トラック操作
  7033.     move.l    play_trk_tbl(pc),a1
  7034. @@:
  7035.     moveq.l    #0,d0
  7036.     move.w    (a1)+,d0
  7037.     cmpi.w    #-1,d0
  7038.     beq    t_dat_ok
  7039.     cmp.w    d0,d1
  7040.     beq    solo_en_tr
  7041.     calc_wk    d0
  7042.     st.b    p_mask_mode(a5)
  7043.     move.l    p_type(a5),d4
  7044.     bsr    _ms_key_off
  7045.     bra    @b
  7046. solo_en_tr:                *全トラックマスク解除
  7047.     clr.b    p_mask_mode(a5)
  7048.     tst.w    p_type(a5)
  7049.     bne    @b
  7050.     move.w    p_ch(a5),d4        *FMのみ音色再設定処理
  7051.     bsr    restore_af
  7052.     bra    @b
  7053.  
  7054. mask_channels:                *v3
  7055.     *   cmd=$5b
  7056.     * < a1.l=parameter table
  7057.     * <     param. sequence
  7058.     *        {device type(.w),ch number(.w),mask mode(.w)...,-1(.l)}
  7059.     *        device type:0,1,$8000-$8002
  7060.     *        ch number  :0-15
  7061.     *        mask mode     0.w:enable
  7062.     *                -1.w:disable
  7063.     *        endcode=-1.l
  7064.     * < a1.l=0    all ch
  7065.     * < d1.w=0    enable
  7066.     * < d1.w=+1    reverse
  7067.     * < d1.w=-1    mask
  7068.     *
  7069.     * < a1.l=1    SOLO mode
  7070.     * < d1.l    type,ch
  7071.     *
  7072.     * > (a0)    設定できなかったチャンネル番号の並び
  7073.     *        -1.l=end code
  7074.     move.l    mask_channel_result(pc),a0
  7075.     move.w    #-1,(a0)
  7076.     ori.w    #$700,sr        *割り込み禁止
  7077.     move.l    a1,d0
  7078.     beq    chmsk_all_ch        *全チャンネルへの操作
  7079.     subq.l    #1,d0
  7080.     beq    solo_ch
  7081. chmsklp00:
  7082.     moveq.l    #0,d0
  7083.     move.l    (a1)+,d4        *check p_type
  7084.     cmpi.l    #-1,d4
  7085.     beq    t_dat_ok        *all end
  7086.     move.l    d4,d0
  7087.     swap    d0
  7088.     tst.w    d0
  7089.     bmi    _mskch_md
  7090.     beq    _mskch_fm
  7091.     lea    ch_mask_ad(pc),a2    *ADPCM
  7092.     cmpi.w    #-1,d4            *-1:全チャンネル
  7093.     bne    @f            *1チャンネルのケース
  7094. _msk_allch:
  7095.     move.w    #16-1,d4
  7096. _mskallch_lp:
  7097.     pea    (a1)            *複数チャンネルのケース
  7098.     move.w    (a2),d3            *ADPCM
  7099.     bsr    get_smkch_mode
  7100.     move.l    a1,d1
  7101.     move.l    (sp)+,a1
  7102.     dbra    d4,_mskallch_lp
  7103.     move.l    d1,a1
  7104.     bra    chmsklp00
  7105. @@:
  7106.     move.w    (a2),d3            *ADPCM
  7107.     bsr    get_smkch_mode
  7108.     bra    chmsklp00
  7109.  
  7110. _mskch_fm:                *FM
  7111.     lea    ch_mask_fm(pc),a2
  7112.     cmpi.w    #-1,d4
  7113.     bne    @b            *1チャンネルのケース
  7114.     moveq.l    #7,d4
  7115.     bra    _mskallch_lp
  7116.  
  7117. _mskch_md:                *MIDI
  7118.     lea    midi_if_tbl(pc),a2
  7119.     ext.w    d0
  7120.     move.b    (a2,d0.w),d0        *> d0はもともと2倍してある
  7121.     bmi    @f            *エラーケースは自動的に後半ルーチンで処理される
  7122.     lea    ch_mask_m0(pc),a2
  7123.     add.w    d0,a2
  7124.     cmpi.w    #-1,d4
  7125.     bne    @b
  7126.     bra    _msk_allch
  7127.  
  7128. @@:
  7129.     addq.w    #2,a1            *skip mode(get modeに相当)
  7130.     move.l    d4,(a0)+        *error(enableにしても影響の有るトラックは無し)
  7131.     move.l    #-1,(a0)            *set endcode
  7132.     rts
  7133.  
  7134. get_smkch_mode:
  7135.     move.w    (a1)+,d0        *get mode
  7136.     beq    chmsk_enable
  7137.     bmi    chmsk_mask
  7138.                     *マスク反転のケース
  7139.     bchg.l    d4,d3
  7140.     bne    _chmsk_enable
  7141.     bra    _chmsk_mask
  7142.  
  7143. chmsk_enable:
  7144.     bclr.l    d4,d3            *enable
  7145. _chmsk_enable:
  7146.     move.w    d3,(a2)
  7147.     moveq.l    #0,d3
  7148.     move.l    play_trk_tbl(pc),a3
  7149. chmsk_en_lp0:                *イネーブル
  7150.     moveq.l    #0,d0
  7151.     move.w    (a3)+,d0
  7152.     cmpi.w    #-1,d0
  7153.     beq    @f            *指定チャンネルは演奏トラックとして存在していない
  7154.     calc_wk    d0
  7155.     cmp.l    p_type(a5),d4        *希望チャンネルか
  7156.     bne    chmsk_en_lp0
  7157.     moveq.l    #-1,d3
  7158.     tst.w    p_type(a5)
  7159.     bne    chmsk_en_lp0
  7160.     bsr    restore_af        *FMの時だけ音色
  7161.     bra    chmsk_en_lp0
  7162. @@:
  7163.     tst.l    d3
  7164.     bne    @f
  7165.     move.l    d4,(a0)+        *error:(disableにしても影響の有るトラックは無し)
  7166.     move.l    #-1,(a0)
  7167. @@:
  7168.     rts
  7169.  
  7170. chmsk_mask:                *マスク
  7171.     bset.l    d4,d3            *mask
  7172. _chmsk_mask:
  7173.     move.w    d3,(a2)
  7174.     moveq.l    #0,d3            *flag
  7175.     move.l    play_trk_tbl(pc),a3
  7176. chmsk_msk_lp0:
  7177.     moveq.l    #0,d0
  7178.     move.w    (a3)+,d0
  7179.     cmpi.w    #-1,d0
  7180.     beq    @f
  7181.     calc_wk    d0
  7182.     cmp.l    p_type(a5),d4        *希望チャンネルか
  7183.     bne    chmsk_msk_lp0
  7184.     bsr    ms_key_off
  7185.     moveq.l    #-1,d3            *1個でも正常に設定したmark on
  7186.     bra    chmsk_msk_lp0        *他のトラックにも同チャンネルがある可能性があるので更にループ
  7187. @@:
  7188.     tst.l    d3
  7189.     bne    @f
  7190.     move.l    d4,(a0)+        *error:(disableにしても影響の有るトラックは無し)
  7191.     move.l    #-1,(a0)
  7192. @@:
  7193.     rts
  7194.  
  7195. chmsk_all_ch:
  7196.     tst.w    d1
  7197.     bmi    all_ch_mask
  7198.     bne    all_ch_reverse
  7199.     moveq.l    #0,d0            *6つのデバイスワークをまとめて初期化
  7200.     move.l    d0,ch_mask_fm-work(a6)
  7201.     move.l    d0,ch_mask_m0-work(a6)
  7202.     move.l    d0,ch_mask_mr0-work(a6)
  7203.     rts                *as same as t_dat_ok
  7204.  
  7205. all_ch_mask:
  7206.     moveq.l    #-1,d0            *5つのデバイスワークをまとめてマスク
  7207.     move.l    d0,ch_mask_fm-work(a6)
  7208.     move.l    d0,ch_mask_m0-work(a6)
  7209.     move.l    d0,ch_mask_mr0-work(a6)
  7210.     move.l    play_trk_tbl(pc),a1
  7211. @@:                    *演奏中のトラックすべてキーオフ
  7212.     moveq.l    #0,d0
  7213.     move.w    (a1)+,d0
  7214.     cmpi.w    #-1,d0
  7215.     beq    t_dat_ok
  7216.     calc_wk    d0
  7217.     move.l    p_type(a5),d4
  7218.     bsr    _ms_key_off
  7219.     bra    @b
  7220.  
  7221. solo_ch:
  7222.     move.l    d1,d0
  7223.     jsr    ch_odr_no        *>d5.l=chオーダー値
  7224.     bmi    t_device_offline
  7225.     moveq.l    #-1,d0
  7226.     lea    ch_mask_mr1-work(a6),a1    *6つのデバイスワークをまとめてマスク
  7227.     move.l    d0,-(a1)        *ch_mask_mr0-work(a6)
  7228.     move.l    d0,-(a1)        *ch_mask_m0-work(a6)
  7229.     move.l    d0,-(a1)        *ch_mask_fm-work(a6)
  7230.     move.l    d5,d0
  7231.     lsr.l    #3,d5
  7232.     bclr.b    d0,(a1,d5.l)        *指定チャンネルのみマスクオフ
  7233.     bra    @f
  7234.  
  7235. all_ch_reverse:
  7236.     not.l    ch_mask_fm-work(a6)    *6つのデバイスワークをまとめてリバース・マスク
  7237.     not.l    ch_mask_m0-work(a6)
  7238.     not.l    ch_mask_mr0-work(a6)
  7239. @@:
  7240.     move.l    play_trk_tbl(pc),a1
  7241. altmsk_lp:                *演奏中のトラックすべてキーオフ
  7242.     moveq.l    #0,d0
  7243.     move.w    (a1)+,d0
  7244.     cmpi.w    #-1,d0
  7245.     beq    t_dat_ok
  7246.     calc_wk    d0
  7247.     move.l    p_type(a5),d4
  7248.     bmi    altmsk_md
  7249.     btst.l    #16,d4
  7250.     beq    @f
  7251.     move.w    ch_mask_ad(pc),d0    *ADPCM
  7252.     btst.l    d4,d0
  7253.     beq    altmsk_lp
  7254.     bsr    ms_key_off_ad
  7255.     bra    altmsk_lp
  7256. @@:                    *FM
  7257.     btst.b    d4,ch_mask_fm+1-work(a6)
  7258.     beq    @f
  7259.     bsr    ms_key_off_fm
  7260.     bra    altmsk_lp
  7261. @@:
  7262.     bsr    restore_af
  7263.     bra    altmsk_lp
  7264. altmsk_md:                *MIDI
  7265.     move.l    d4,d0
  7266.     swap    d0            *d0=p_type
  7267.     add.w    d0,d0            *kill 16th bit & x2
  7268.     lea    ch_mask_m0(pc),a2
  7269.     move.w    (a2,d0.w),d0
  7270.     btst.l    d4,d0
  7271.     beq    altmsk_lp
  7272.     bsr    ms_key_off_md
  7273.     bra    altmsk_lp
  7274.  
  7275. set_ch_output_level:            *各チャンネルの出力レベルの設定
  7276.     *   cmd=$5c
  7277.     * < a1.l=parameter table
  7278.     * <     param. sequence
  7279.     *        {device type(.w),ch number(.w),omt(b),speed(.w),start(.b),end(.b)}
  7280.     *        device type:0,1,$8000~$8002,-1:all
  7281.     *        ch number:0-15
  7282.     *        omt:d0=speed,d1=start,d2=end
  7283.     *        fader speed:0-65535
  7284.     *        start level:0-128
  7285.     *        end level:0-128
  7286.     * > d0         0:ok
  7287.     *        -1:error
  7288.     ori.w    #$700,sr    *割り込み禁止
  7289.     bsr    stop_tm_int_ms
  7290.     move.w    sr_type(pc),sr    *INT enable
  7291.     move.l    a1,a0
  7292.     jbsr    get_fader
  7293.     move.l    a0,a1
  7294.     move.l    fader_result(pc),d0
  7295.     bra    start_tm_int_ms
  7296.  
  7297. set_tr_output_level:            *各トラックの出力レベルの設定
  7298.     *   cmd=$5d
  7299.     * < a1.l=parameter table
  7300.     * <     sequence of {tr number(.w),omt(b),speed(.w),start(.b),end(.b)}
  7301.     *        tr number.w:0-65534,65535:all
  7302.     *        omt:d0=speed,d1=start,d2=end
  7303.     *        fader speed:0-65535
  7304.     *        start level:0-128
  7305.     *        end level:0-128
  7306.     * > d0         0:ok
  7307.     *        -1:error
  7308.     ori.w    #$700,sr        *割り込み禁止
  7309.     bsr    stop_tm_int_ms
  7310.     move.w    sr_type(pc),sr        *INT enable
  7311.     move.l    a1,a0
  7312.     cmpi.w    #-1,(a0)        *check mode at first
  7313.     beq    all_stol
  7314.                     *トラックフェーダー
  7315.     jbsr    do_chfdr_track_mode1
  7316.     move.l    a0,a1
  7317.     move.l    fader_result(pc),d0
  7318.     bra    start_tm_int_ms
  7319. all_stol:                *全トラックフェーダー
  7320.     addq.w    #2,a0
  7321.     jbsr    do_chfdr_track_mode2
  7322.     move.l    a0,a1
  7323.     move.l    fader_result(pc),d0
  7324.     bra    start_tm_int_ms
  7325.  
  7326. master_fader:            *フェードアウト/イン処理
  7327.     *   cmd=$5e
  7328.     * < a1.l=parameter list address
  7329.     *    { device-code.w:0/1/$8000~$8002/-1,
  7330.     *      omt.b:%000~%111
  7331.     *      speed.w:0-65535
  7332.     *      start-level.b:0-128, end-level.b:0-128}
  7333.     * > d0    =0:ok
  7334.     *    -1:error
  7335.     ori.w    #$700,sr
  7336.     bsr    stop_tm_int_ms
  7337.     move.w    sr_type(pc),sr    *INT enable
  7338.     move.l    a1,a0
  7339.     jbsr    get_mstr_fader
  7340.     move.l    a0,a1
  7341.     move.l    fader_result(pc),d0
  7342.     bra    start_tm_int_ms
  7343.  
  7344. get_fader_status:        *フェーダーの状態を得る
  7345.     *   cmd=$5f
  7346.     * > d0.l d0:実行中のチャンネルフェーダーすべてが目的に達している(1:達成した 0:達成していない)
  7347.     *     d1:実行中のマスターフェーダーすべてが目的に達している(1:達成した 0:達成していない)
  7348.     *     d6:チャンネルフェーダーの状態(1:実行中 0:実行されていない)
  7349.     *     d7:マスターフェーダーの状態(1:実行中 0:実行されていない)
  7350.     moveq.l    #0,d0
  7351.     move.b    fader_flag(pc),d6
  7352.     move.b    d6,d0
  7353.     beq    3f        *フェーダー類はなにも実行されておらず
  7354.     bpl    2f        *マスターフェーダーの調査
  7355.     lea    mstfd_fm_spd2(pc),a3
  7356.     lea    master_fader_tbl(pc),a4
  7357.     moveq.l    #0,d2        *実行中のフェーダー数
  7358.     moveq.l    #0,d3        *目的を達成したフェーダー数
  7359. @@:
  7360.     move.w    (a4)+,d1    *d1 must be 0,8,16,24,32,40 or -1(予めfd_wkl倍してある)
  7361.     bmi    1f
  7362.     lea    (a3,d1.w),a2
  7363.     addq.w    #1,d2
  7364.     tst.l    (a2)        *fd_spd=spd2=0は目的達成を表す
  7365.     bne    @b
  7366.     addq.w    #1,d3
  7367.     bra    @b
  7368. 1:
  7369.     cmp.w    d2,d3
  7370.     bne    2f
  7371.     bset.l    #1,d0        *すべて達成
  7372. 2:
  7373.     add.b    d6,d6            *ch_fader on?
  7374.     bpl    3f
  7375.     lea    ch_fm_fdp(pc),a3
  7376.     lea    ch_fader_tbl(pc),a4
  7377.     moveq.l    #0,d2            *実行中のフェーダー数
  7378.     moveq.l    #0,d3            *目的を達成したフェーダー数
  7379. @@:
  7380.     move.w    (a4)+,d1        *d1 must be 0~95, or -1
  7381.     bmi    1f
  7382.     lsl.w    #fd_wkl_,d1
  7383.     lea    (a3,d1.w),a2
  7384.     addq.w    #1,d2
  7385.     tst.l    (a2)            *fd_spd=spd2=0は目的達成を表す
  7386.     bne    @b
  7387.     addq.w    #1,d3
  7388.     bra    @b
  7389. 1:
  7390.     cmp.w    d2,d3
  7391.     bne    3f
  7392.     bset.l    #0,d0        *すべて達成
  7393. 3:
  7394.     rts
  7395.  
  7396. get_play_time:            *演奏時間の取得
  7397.     *   cmd=$60
  7398.     * > d0.l=00HH:MM:LL
  7399.     *HH:0-99 MM:0-59 SS:0-59
  7400.     cmp.l    #-1,play_start_time-work(a6)
  7401.     beq    t_dat_ok        *測定不可能
  7402. @@:
  7403.     bsr    get_sec_present_time    *> d1.l=time
  7404.     move.l    d1,d2
  7405.     bsr    get_sec_present_time    *> d1.l=time
  7406.     cmp.l    d1,d2            *時間読み込みエラー防止のため
  7407.     bne    @b
  7408.  
  7409.     lea    play_start_time-work(a6),a0
  7410.     bsr    cnv_time_to_sec        *>d0.l=sec次元値
  7411.     lea    play_stop_time-work(a6),a0
  7412.     tst.l    (a0)
  7413.     bmi    1f            *停止していない
  7414.     move.l    d0,d3            *d3.l=play start time
  7415.     bsr    cnv_time_to_sec        *>d0.l=sec次元値
  7416.     lea    play_cont_time-work(a6),a0
  7417.     tst.l    (a0)
  7418.     bpl    @f
  7419.     move.l    d0,d2
  7420.     move.l    d3,d0
  7421.     bra    1f            *停止中ならば演奏経過時間も停止してやる
  7422. @@:
  7423.     move.l    d0,d1            *d1.l=play stop time
  7424.     bsr    cnv_time_to_sec        *>d0.l=sec次元値
  7425.     move.l    #-1,(a0)        *play_cont_time=-1
  7426.     move.l    #-1,-(a0)        *play_stop_time=-1
  7427.     cmp.l    d1,d3
  7428.     bls    @f
  7429.     add.l    #60*60*24,d1
  7430. @@:
  7431.     sub.l    d3,d1
  7432.     add.l    d1,d2
  7433.     move.l    d0,d3
  7434.     cmp.l    d3,d1
  7435.     bls    @f
  7436.     add.l    #60*60*24,d3
  7437. @@:
  7438.     sub.l    d1,d3
  7439.     movem.l    d0/d2,-(sp)
  7440.     move.l    d3,d2            *00HHMMSSでplay_start_timeに格納する
  7441.     bsr    cnv_sec_to_time
  7442.     moveq.l    #0,d1
  7443.     move.b    d0,d1
  7444.     divu    #10,d1
  7445.     lsl.b    #4,d1
  7446.     move.b    d1,-(a0)
  7447.     swap    d1
  7448.     or.b    d1,(a0)            *SS
  7449.     lsr.l    #8,d0
  7450.     moveq.l    #0,d1
  7451.     move.b    d0,d1
  7452.     divu    #10,d1
  7453.     lsl.b    #4,d1
  7454.     move.b    d1,-(a0)
  7455.     swap    d1
  7456.     or.b    d1,(a0)            *MM
  7457.     lsr.l    #8,d0
  7458.     moveq.l    #0,d1
  7459.     move.b    d0,d1
  7460.     divu    #10,d1
  7461.     lsl.b    #4,d1
  7462.     move.b    d1,-(a0)
  7463.     swap    d1
  7464.     or.b    d1,(a0)            *HH
  7465.     clr.b    -(a0)            *dummy
  7466.     movem.l    (sp)+,d0/d2
  7467. 1:
  7468.     cmp.l    d2,d0
  7469.     bls    @f
  7470.     add.l    #60*60*24,d2
  7471. @@:
  7472.     sub.l    d0,d2
  7473. cnv_sec_to_time:
  7474.     * < d2.l=sec
  7475.     * > d0.l=time
  7476.     divu    #60*60,d2
  7477.     move.w    d2,d0        *HH
  7478.     swap    d0
  7479.     clr.w    d2
  7480.     swap    d2
  7481.     divu    #60,d2
  7482.     move.b    d2,d0        *MM
  7483.     lsl.w    #8,d0
  7484.     swap    d2
  7485.     move.b    d2,d0        *SS
  7486.     rts
  7487.  
  7488. cnv_time_to_sec:
  7489.     * < (a0).l=00HHMMSS
  7490.     move.l    d1,-(sp)
  7491.     moveq.l    #0,d0
  7492.     move.b    1(a0),d0    *get HH
  7493.     lsr.b    #4,d0
  7494.     mulu    #60*60*10,d0
  7495.     move.b    1(a0),d1    *get HH
  7496.     andi.w    #$0f,d1
  7497.     mulu    #60*60,d1
  7498.     add.l    d1,d0
  7499.     moveq.l    #0,d1
  7500.     move.b    2(a0),d1    *get MM
  7501.     lsr.b    #4,d1
  7502.     mulu    #60*10,d1
  7503.     add.l    d1,d0
  7504.     move.b    2(a0),d1    *get MM
  7505.     andi.w    #$0f,d1
  7506.     mulu    #60,d1
  7507.     add.l    d1,d0
  7508.     moveq.l    #0,d1
  7509.     move.b    3(a0),d1    *get SS
  7510.     lsr.b    #4,d1
  7511.     mulu    #10,d1
  7512.     add.l    d1,d0
  7513.     move.b    3(a0),d1    *get SS
  7514.     andi.l    #$0f,d1
  7515.     add.l    d1,d0
  7516.     move.l    (sp)+,d1
  7517.     rts
  7518.  
  7519. get_sec_present_time:            *現在の時刻を秒次元に変換して取得する
  7520.     * > d1.l=time
  7521.     movem.l    d0/d3/a2,-(sp)
  7522.     lea    $e8a00c,a2        *演奏開始時間を記録しておく
  7523.     bclr.b    #0,$e8a01b-$e8a00c(a2)    *bank 0
  7524.     move.w    -(a2),d1        *hour
  7525.     andi.w    #$0f,d1
  7526.     mulu    #10*60*60,d1
  7527.     move.w    -(a2),d0
  7528.     andi.w    #$0f,d0
  7529.     mulu    #60*60,d0
  7530.     add.l    d0,d1
  7531.     move.w    -(a2),d0        *minute
  7532.     andi.w    #$0f,d0
  7533.     mulu    #10*60,d0
  7534.     add.l    d0,d1
  7535.     move.w    -(a2),d0
  7536.     andi.w    #$0f,d0
  7537.     mulu    #60,d0
  7538.     add.l    d0,d1
  7539.     move.w    -(a2),d0        *second
  7540.     andi.w    #$0f,d0
  7541.     mulu    #10,d0
  7542.     add.l    d0,d1
  7543.     move.w    -(a2),d0
  7544.     andi.l    #$0f,d0
  7545.     add.l    d0,d1
  7546.     movem.l    (sp)+,d0/d3/a2
  7547.     rts
  7548.  
  7549. get_1st_comment:        *最初のコメントを取り出す
  7550.     *   cmd=$61
  7551.     * > a0.l=comment_address
  7552.     move.l    trk_buffer_top(pc),d0    *IDなしのアドレスだからz_系オフセットは-8して使用
  7553.     beq    t_dat_ok2
  7554.     move.l    d0,a0
  7555.     add.l    #z_title_offset-8,a0
  7556.     move.l    (a0)+,d0
  7557.     beq    t_dat_ok2
  7558.     add.l    d0,a0
  7559.     t_dat_ok
  7560.  
  7561. get_timer_mode:            *どのタイマーを使用しているか
  7562.     *   cmd=$62
  7563.     * > d0.l=timer type(0:Timer A  1:Timer B  2:YM3802 timer)
  7564.     tst.b    timer_mode-work(a6)
  7565.     bmi    t_dat_ok    *timer_a->d0.l=0
  7566.     bne    @f
  7567.     moveq.l    #1,d0        *timer_b->d0.l=1
  7568.     rts
  7569. @@:
  7570.     moveq.l    #2,d0        *timer_m->d0.l=2
  7571.     rts
  7572.  
  7573. get_track_table:        *トラックテーブルのアドレスを得る
  7574.     *   cmd=$63
  7575.     * > a0.l=play_trk_tbl
  7576.     * > d0.l=play_trk_tbl_se
  7577.     move.l    play_trk_tbl(pc),a0
  7578.     move.l    play_trk_tbl_se(pc),d0
  7579.     rts
  7580.  
  7581. get_play_work:            *演奏ワークアドレスを返す    !v3
  7582.     *   cmd=$64
  7583.     * < d1.l=trk number(0-65534)
  7584.     * > a0=trk n seq_wk_tbl
  7585.     * > d0=trk n seq_wk_tbl_se
  7586.     calc_wk    d1
  7587.     movea.l    a5,a0
  7588.     movea.l    seq_wk_tbl_se(pc),a5
  7589.     adda.l    d1,a5
  7590.     move.l    a5,d0
  7591.     rts
  7592.  
  7593. get_buffer_information:            *各バッファのインフォメーション
  7594.     *   cmd=$65
  7595.     * > a0.l=buffer head address
  7596.     lea    trk_buffer_top(pc),a0
  7597.     rts
  7598.  
  7599. get_zmsc_status:            *ZMUSICのワーク状況    !v3
  7600.     *   cmd=$66
  7601.     * > a0.l=status work address
  7602.     lea    zmusic_stat(pc),a0
  7603.     rts
  7604. *-----------------------------------------------------------------------------
  7605. application_releaser:        *サポートプログラムの解除ルーチンの登録
  7606.     *   cmd=$68
  7607.     * < a1.l=release routine address(0:cancel)
  7608.     * < d1.l=result code(キャンセル時に使用)
  7609.     * > d0.l=result code
  7610.     * > a0.l=0:error/nz:no error
  7611.     * 1)    a1.lから始まる各解放ルーチンは必要処理を実行後、最後に
  7612.     *    ZMUSIC側で解放してほしいメモリブロックがあるならば
  7613.     *    そのアドレスをa0.lにかえすようにすること。
  7614.     *    なければa0.l=0を返すこと
  7615.     * 2)    a1.lからの各解放ルーチンでなにか表示したいメッセージが
  7616.     *    有る場合はその文字列のアドレスをa1.lに返すようにすること。
  7617.     *    なければa1.l=0を返すこと
  7618.     * 3)    解放ルーチンでエラーが発生した場合は戻り値として
  7619.     *    d0.l(0:no error,1:occupied,-1:error)を返すことが出来る。
  7620.     *    エラーが発声した場合もその旨を告げるメッセージ文字列をa1.lに
  7621.     *    与えることが出来る。
  7622.     move.l    a1,d0                *d0に意味無し
  7623.     bne    spt_set_mode
  7624.                         *キャンセル
  7625.     move.l    nof_ex_appli(pc),d0
  7626.     beq    t_no_application_registered    *1個も登録されていない
  7627.     move.l    ex_appli_addr(pc),a0
  7628. @@:
  7629.     cmp.l    4(a0),d1
  7630.     beq    @f
  7631.     addq.w    #8,a0
  7632.     subq.l    #1,d0
  7633.     bne    @b
  7634.     bra    t_illegal_result_code
  7635. @@:
  7636.     move.l    8(a0),(a0)+
  7637.     move.l    8(a0),(a0)+
  7638.     subq.l    #1,d0
  7639.     bne    @b
  7640.     subq.l    #1,nof_ex_appli-work(a6)
  7641.     t_dat_ok
  7642. spt_set_mode:
  7643.     move.l    nof_ex_appli(pc),d1
  7644.     bne    1f                *既にある
  7645.     move.l    ex_appli_addr(pc),d0
  7646.     move.l    d0,a0
  7647.     bne    @f                *既にある
  7648.     move.l    #ID_APPLI,d3
  7649.     move.l    #1024,d2
  7650.     move.l    d2,ex_appli_size-work(a6)    *バッファ新設
  7651.     bsr    get_mem
  7652.     tst.l    d0
  7653.     bmi    t_out_of_memory
  7654.     move.l    a0,ex_appli_addr-work(a6)
  7655. @@:
  7656.     move.l    a1,(a0)+            *アドレス登録
  7657.     move.l    ex_appli_id(pc),d0
  7658.     move.l    d0,(a0)+
  7659.     addq.l    #1,nof_ex_appli-work(a6)
  7660.     addq.l    #1,ex_appli_id-work(a6)
  7661.     rts
  7662. 1:                        *1こ以上の場合
  7663.     lsl.l    #3,d1
  7664.     move.l    ex_appli_size(pc),d2
  7665.     move.l    ex_appli_addr(pc),a0
  7666.     move.l    a1,d3
  7667.     cmp.l    d2,d1                *既に確保したバッファ領域内
  7668.     bcs    @f
  7669.     move.l    a0,a1
  7670.     add.l    #128,d2
  7671.     jsr    enlarge_mem-work(a6)
  7672.     tst.l    d0
  7673.     bmi    t_out_of_memory
  7674.     move.l    d2,ex_appli_size-work(a6)
  7675.     move.l    a0,ex_appli_addr-work(a6)
  7676. @@:
  7677.     move.l    d3,0(a0,d1.l)            *アドレス登録
  7678.     move.l    ex_appli_id(pc),d0
  7679.     move.l    d0,4(a0,d1.l)            *ID登録
  7680.     addq.l    #1,nof_ex_appli-work(a6)
  7681.     addq.l    #1,ex_appli_id-work(a6)
  7682.     rts
  7683.  
  7684. ex_appli_id:    dc.l    0
  7685. nof_ex_appli:    dc.l    0
  7686. ex_appli_addr:    dc.l    0
  7687. ex_appli_size:    dc.l    0
  7688.  
  7689. release_driver:                *ZMUSICの解除
  7690.     *   cmd=$69
  7691.     * > d0.l=error code(0:release completed)
  7692.     * > a0.l=driver address(to be free)
  7693. *    tst.b    cmd_or_dev-work(a6)
  7694. *    beq    rv_cannot_release    *device=で登録したものは解除出来ない
  7695.     bsr    m_init
  7696.     bsr    wait_trns        *m_init()で送信されたMIDIデータの送信終了まで待つ
  7697.     tst.b    smf_end_flag-work(a6)    *smf_end_flag=-1の場合はエラー
  7698.     ble    @f
  7699.     bsr    release_int_mode    *SMFの割り込みモード解除
  7700. @@:                    *サポートプログラムの解除
  7701.     move.l    nof_ex_appli(pc),d2
  7702.     beq    delete_dvnm        *解除するもの無し
  7703.     move.l    ex_appli_addr(pc),a2
  7704. rlsdrvlp00:
  7705.     move.l    (a2),a0            *あえて(a2)+としない(コールしたあとで前につまるから)
  7706.     movem.l    d1-d7/a2-a6,-(sp)
  7707.     jsr    (a0)            *a0.l=release addr.,a1.l=release message
  7708.     movem.l    (sp)+,d1-d7/a2-a6
  7709.     move.l    d0,d1            *戻り値保存
  7710.     move.l    a1,d0
  7711.     beq    @f
  7712.     jsr    prta1
  7713. @@:
  7714.     tst.l    d1
  7715.     bne    next_rlsdrv        *error/occupied
  7716.     move.l    a0,d0
  7717.     beq    next_rlsdrv        *解除するメモリはない
  7718.     pea    $10(a0)
  7719.     DOS    _MFREE
  7720.     addq.w    #4,sp
  7721. next_rlsdrv:
  7722.     subq.l    #1,d2
  7723.     bne    rlsdrvlp00
  7724. delete_dvnm:
  7725.     bsr    wait_trns    *解放時にZMUSICのファンクションを使用するかも知れないから
  7726.     moveq.l    #ID_ALL,d3
  7727.     bsr    free_mem2    *その他のバッファも解放
  7728.  
  7729.     bsr    kill_OPM    *デバイス名をシステムワークより除去
  7730.     bmi    rv_cannot_release
  7731.  
  7732.     bsr    back_copy_key
  7733.  
  7734.     bsr    release_vectors
  7735.  
  7736.     move.l    a0work(pc),a0    *ドライバ解除アドレス
  7737.     t_dat_ok
  7738.  
  7739. rv_cannot_release:
  7740.     moveq.l    #-1,d0
  7741.     rts
  7742.  
  7743. release_vectors:
  7744.     * - all
  7745.     move.w    sr,-(sp)
  7746.     ori.w    #$0700,sr
  7747.     movem.l    d0-d2/a1-a2,-(sp)
  7748.     move.b    midi_board(pc),d2
  7749.     beq    relvec0
  7750.     lea    rgr,a1
  7751.     btst.l    #if_m0,d2
  7752.     beq    @f
  7753.     move.b    #$80,(a1)    *initial reset
  7754.     moveq.l    #0,d0        *1/60/512=0.000032secのウエイト
  7755.     bsr    h_wait
  7756.     clr.b    (a1)        *initial reset end
  7757.     midiwait
  7758.     clr.b    grp6-rgr(a1)    *disable all int.
  7759.     midiwait
  7760. @@:
  7761.     btst.l    #if_m1,d2
  7762.     beq    @f
  7763.     lea    $10(a1),a1
  7764.     move.b    #$80,(a1)    *initial reset
  7765.     moveq.l    #0,d0        *1/60/512=0.000032secのウエイト
  7766.     bsr    h_wait
  7767.     clr.b    (a1)        *intial reset end
  7768.     midiwait
  7769.     clr.b    grp6-rgr(a1)    *disable all int.
  7770.     midiwait
  7771. @@:
  7772.     btst.l    #if_mr0,d2
  7773.     beq    relvec0
  7774.     lea    scc_a,a1
  7775.     tst.b    (a1)
  7776.     moveq.l    #(scca_init_e-scca_init)-1,d0
  7777.     lea    scca_init(pc),a2
  7778. @@:
  7779.     move.b    (a2)+,(a1)
  7780.     dbra    d0,@b
  7781.     moveq.l    #-1,d1            *RS232Cのパラメータ復元
  7782.     IOCS    _SET232C
  7783.     move.l    d0,d1
  7784.     IOCS    _SET232C
  7785.                     *念のためにマウスの初期化も行う
  7786.     moveq.l    #(sccb_init_e-sccb_init)-1,d0
  7787.     subq.w    #4,a1
  7788.     lea    sccb_init(pc),a2
  7789. @@:
  7790.     move.b    (a2)+,(a1)
  7791.     dbra    d0,@b
  7792.     IOCS    _MS_INIT
  7793. relvec0:            *MPCMの占有解除
  7794.     tst.b    ext_pcmdrv-work(a6)
  7795.     beq    @f
  7796.     lea    ZMSC3_X-work(a6),a1
  7797.     move.w    #M_FREE,d0
  7798.     MPCM_call
  7799.     bra    gb_intvcs
  7800. @@:                    *ZMUSIC同梱の標準ADPCMドライバの解除
  7801.     move.l    adpcm_stop_v-work(a6),d0
  7802.     beq    @f
  7803.     move.l    d0,$1a8.w        *get back int adpcm stop vector
  7804. @@:
  7805.     move.l    adpcmout_v-work(a6),d0
  7806.     beq    @f
  7807.     move.w    #$160,d1
  7808.     movea.l    d0,a1
  7809.     IOCS    _B_INTVCS    *get back int adpcmout vector
  7810. @@:
  7811.     move.l    adpcmmod_v-work(a6),d0
  7812.     beq    @f
  7813.     move.w    #$167,d1
  7814.     movea.l    d0,a1
  7815.     IOCS    _B_INTVCS    *get back int adpcmmod vector
  7816. @@:                *MPCM組み込み拒否マークの削除
  7817.     move.l    dummy_vect(pc),d0
  7818.     beq    @f
  7819.     move.l    d0,$84.w
  7820. @@:
  7821. gb_intvcs:
  7822.     move.l    sv_trap3(pc),d0
  7823.     beq    @f
  7824.     move.l    d0,$8c.w    *get back trap #3 vector
  7825. @@:                *midi in 1
  7826.     move.l    rec_vect(pc),d0
  7827.     beq    @f
  7828.     move.l    d0,$228.w    *get back $8a vector
  7829. @@:                *midi out 1
  7830.     move.l    mot_vect(pc),d0
  7831.     beq    @f
  7832.     move.l    d0,$230.w    *get back $8c vector
  7833. @@:                *midi in 2
  7834.     move.l    rec_vect2(pc),d0
  7835.     beq    @f
  7836.     move.l    d0,$2a8.w    *get back $aa vector
  7837. @@:                *midi out 2
  7838.     move.l    mot_vect2(pc),d0
  7839.     beq    @f
  7840.     move.l    d0,$2b0.w    *get back $ac vector
  7841. @@:                *rs-midi
  7842.     lea    rs_vect-work(a6),a1
  7843.     move.l    (a1),d0
  7844.     beq    rls000
  7845.     lea    $160.w,a0
  7846.     moveq.l    #8-1,d0
  7847. @@:
  7848.     move.l    (a1)+,(a0)+
  7849.     dbra    d0,@b
  7850. rls000:                *midi timer
  7851.     move.l    mint_vect(pc),d0
  7852.     beq    @f
  7853.     move.l    d0,$238.w    *get back $8e vector
  7854. @@:                *opm timer
  7855.     move.l    eint_vect(pc),d0
  7856.     beq    @f
  7857.     move.l    d0,$210.w    *get back $84 vector
  7858. @@:                *opm timer
  7859.     move.l    rmint_vect(pc),d0
  7860.     beq    @f
  7861.     move.l    d0,$200.w    *get back $80 vector
  7862. @@:                *opm timer
  7863.     tst.b    opm_vect-work(a6)
  7864.     beq    exit_relvc
  7865.     suba.l    a1,a1
  7866.     IOCS    _OPMINTST
  7867. exit_relvc:
  7868.     movem.l    (sp)+,d0-d2/a1-a2
  7869.     move.w    (sp)+,sr
  7870.     rts
  7871.  
  7872. scca_init:
  7873.     dc.b    $09,$c0,$09,$80,$04,$45,$01,$00
  7874.     dc.b    $02,$50,$03,$c0,$05,$e2,$09,$01
  7875.     dc.b    $0b,$56,$0c,$0e,$0d,$00,$0e,$02
  7876.     dc.b    $03,$c1,$05,$ea,$00,$80,$0e,$03
  7877.     dc.b    $0f,$00,$00,$10,$00,$10,$01,$10
  7878. scca_init_e:
  7879. sccb_init:
  7880.     dc.b    $09,$40,$04,$4c,$01,$00,$03,$c0
  7881.     dc.b    $05,$e0,$0b,$56,$0c,$1f,$0d,$00
  7882.     dc.b    $0e,$02,$03,$c1,$05,$e8,$00,$80
  7883.     dc.b    $0e,$03,$0f,$00,$00,$10,$00,$10
  7884.     dc.b    $01,$10,$09,$09
  7885. sccb_init_e:
  7886.     .even
  7887.  
  7888. wait_trns:            *MIDIデータの送信終わり待ち
  7889.     move.w    sr,-(sp)
  7890.     andi.w    #$f8ff,sr
  7891.     movem.l    d0-d1/a0-a1,-(sp)
  7892.     moveq.l    #if_max-1,d1
  7893.     lea    m_buffer_0(pc),a0
  7894. wtrlp:
  7895.     move.l    (a0)+,d0
  7896.     beq    wtr1
  7897.     move.l    d0,a1
  7898. @@:                *送信終了まで待つ
  7899.     tst.w    m_len(a1)
  7900.     bne    @b
  7901. wtr1:
  7902.     dbra    d1,wtrlp
  7903.     movem.l    (sp)+,d0-d1/a0-a1
  7904.     move.w    (sp)+,sr
  7905.     rts
  7906.  
  7907. back_copy_key:            *COPY KEY VECTOR復元
  7908.     movem.l    d0-d1/a0-a3,-(sp)
  7909.     move.l    a0work-work(a6),a0
  7910. @@:
  7911.     move.l    (a0),d0
  7912.     beq    @f
  7913.     move.l    d0,a0
  7914.     bra    @b
  7915. @@:
  7916.     move.l    copy_org(pc),d1        *元の処理ルーチンアドレス(これで書き戻す)
  7917.     lea    copy_key(pc),a2
  7918. bcklp:
  7919.     cmp.l    $54(a0),a2        *$54=copy key vector,(trap #12)
  7920.     bne    @f
  7921.     move.l    d1,$54(a0)
  7922. @@:
  7923.     move.l    12(a0),d0
  7924.     beq    exit_bck
  7925.     move.l    d0,a0
  7926.     bra    bcklp
  7927. exit_bck:
  7928.     movem.l    (sp)+,d0-d1/a0-a3
  7929.     rts
  7930.  
  7931. kill_OPM:            *デバイス名の除去
  7932.     * > eq=no error
  7933.     * > mi=error
  7934.     lea    $6800,a0        *デバイス名”OPM”を強制的に削除する
  7935. KO_lp01:
  7936.     lea    NUL(pc),a2
  7937.     bsr    do_find
  7938.     cmpa.l    a2,a0
  7939.     bcc    KO_err
  7940.     cmpi.w    #$8024,-18(a0)    *本当にNULか
  7941.     bne    KO_lp01
  7942.  
  7943.     lea    -22(a0),a1
  7944.     move.l    a1,nul_address-work(a6)
  7945.  
  7946.     lea    dev_name0,a2
  7947.     bsr    rmk_heap            *ヒープ調査(return:a1,a0)
  7948.     bmi    KO_err
  7949.     move.l    dev_header2,(a0)    *ヒープを再構成して自分は抜ける
  7950.  
  7951.     moveq.l    #0,d0
  7952.     rts
  7953. KO_err:
  7954.     moveq.l    #-1,d0
  7955.     rts
  7956.  
  7957. rmk_heap:
  7958.     * < a1.l=NUL
  7959.     * < a2.l=抜けたいデバイス名
  7960.     * > a0.l=探し出したデバイス名のアドレスの1つ前のデバイスのアドレス
  7961.     * d0,a0,a1,a2
  7962.     lea    -14(a2),a3
  7963. KO_lp02:
  7964.     bsr    same_dev?
  7965.     bne    @f
  7966.     cmp.l    a1,a3
  7967.     bne    @f
  7968.     moveq.l    #0,d0        *Hit!
  7969.     rts
  7970. @@:
  7971.     cmpi.l    #-1,(a1)    *最後尾に来てしまったか
  7972.     beq    err_KO
  7973.     movea.l    a1,a0        *一つ前のをキープ(戻り値になる)
  7974.     move.l    (a1),a1        *次へ
  7975.     bra    KO_lp02
  7976. err_KO:
  7977.     moveq.l    #-1,d0
  7978.     rts
  7979.  
  7980. same_dev?:            *同じ名前かどうか
  7981.     * < a2.l=source name
  7982.     * > mi=not same
  7983.     * > eq=same
  7984.     movem.l    a1-a2,-(sp)
  7985.     lea    14(a1),a1
  7986.     moveq.l    #8-1,d1
  7987. @@:
  7988.     cmpm.b    (a1)+,(a2)+
  7989.     bne    @f
  7990.     dbra    d1,@b
  7991.     moveq.l    #0,d0
  7992.     movem.l    (sp)+,a1-a2
  7993.     rts
  7994. @@:
  7995.     moveq.l    #-1,d0
  7996.     movem.l    (sp)+,a1-a2
  7997.     rts
  7998.  
  7999. do_find:            *特定のデバイス名を探し出す
  8000.     move.b    (a2),d0
  8001. dfn_lp01:            *一文字目が見付かるまでループ
  8002.     cmp.b    (a0)+,d0
  8003.     bne    dfn_lp01
  8004.  
  8005.     move.l    a0,d0        *save a0 to d0
  8006.     lea    1(a2),a1
  8007.     moveq.l    #7-1,d1
  8008. dfn_lp02:
  8009.     cmpm.b    (a0)+,(a1)+
  8010.     bne    next_dfn
  8011.     dbra    d1,dfn_lp02
  8012.     rts
  8013. next_dfn:
  8014.     movea.l    d0,a0        *get back a0
  8015.     bra    do_find
  8016.  
  8017. occupy_zmusic:            *ZMUSICドライバの占有
  8018.     *   cmd=$6a
  8019.     * < d1.l=1    lock ZMUSIC
  8020.     * < d1.l=0    unlock ZMUSIC
  8021.     * < d1.l=-1    ask status
  8022.     * > d0.l    case:d1.l=1,0    d0:以前の占有状態(d1.l=-1のケース参照)
  8023.     * > d0.l    case:d1.l=-1    d0=0:free,    d0.l=1:occupied
  8024.     tst.l    d1
  8025.     bmi    1f
  8026.     beq    @f
  8027.                         *Lock
  8028.     addq.b    #1,occupy_flag-work(a6)
  8029.     bra    1f
  8030. @@:                        *Unlock
  8031.     tst.b    occupy_flag-work(a6)
  8032.     beq    1f
  8033.     subq.b    #1,occupy_flag-work(a6)
  8034. 1:
  8035.     moveq.l    #0,d0
  8036.     move.b    occupy_flag(pc),d0
  8037.     rts
  8038.  
  8039. hook_fnc_service:        *ファンクションコールのフック
  8040.     *   cmd=$6b
  8041.     * < d1.l=function number
  8042.     * < a1.l=new user's job address(-1:ask mode)
  8043.     * > a0.l=original job address
  8044.     move.l    d1,d0
  8045.     swap    d0
  8046.     cmpi.w    #1,d0        *上位2バイトチェック
  8047.     beq    domdoutpatch    *MIDI出力ルーチンへのパッチ
  8048.     cmpi.l    #127,d1
  8049.     bhi    t_illegal_function_number
  8050.     lea    m_job_tbl(pc),a2
  8051.     add.w    d1,d1
  8052.     add.w    d1,d1
  8053.     move.l    (a2,d1.w),a0    *a0.l=original address
  8054.     cmp.l    #-1,a1
  8055.     beq    t_dat_ok    *case:ask mode
  8056.     move.l    a1,(a2,d1.w)
  8057.     t_dat_ok
  8058. domdoutpatch:            *MIDI出力ルーチン書き換えケース
  8059.     add.w    d1,d1
  8060.     move.w    @f(pc,d1.w),d1
  8061.     jmp    @f(pc,d1.w)
  8062. @@:
  8063.     dc.w    hfsm0-@b
  8064.     dc.w    hfsm1-@b
  8065.     dc.w    hfsr0-@b
  8066.     dc.w    hfsr1-@b
  8067. hfsm0:                *CZ6BM1 #1
  8068.     move.l    a1,d0
  8069.     beq    1f
  8070.     addq.l    #1,d0        *d0=-1?
  8071.     beq    @f
  8072.     move.l    a1,m_out_m0+2-work(a6)
  8073.     move.l    a2,_m_out_m0+2-work(a6)
  8074.     bsr    cache_flush
  8075. @@:
  8076.     lea    m_out_m0+6-work(a6),a0
  8077.     move.l    #_m_out_m0+6,d0
  8078.     rts
  8079. 1:
  8080.     move.l    #m_out_m0+6,m_out_m0+2-work(a6)
  8081.     move.l    #_m_out_m0+6,_m_out_m0+2-work(a6)
  8082.     bsr    cache_flush
  8083.     t_dat_ok
  8084. hfsm1:                *CZ6BM1 #2
  8085.     move.l    a1,d0
  8086.     beq    1f
  8087.     addq.l    #1,d0        *d0=-1?
  8088.     beq    @f
  8089.     move.l    a1,m_out_m1+2-work(a6)
  8090.     move.l    a2,_m_out_m1+2-work(a6)
  8091.     bsr    cache_flush
  8092. @@:
  8093.     lea    m_out_m1+6-work(a6),a0
  8094.     move.l    #_m_out_m1+6,d0
  8095.     rts
  8096. 1:
  8097.     move.l    #m_out_m1+6,m_out_m1+2-work(a6)
  8098.     move.l    #_m_out_m1+6,_m_out_m1+2-work(a6)
  8099.     bsr    cache_flush
  8100.     t_dat_ok
  8101. hfsr0:                *RS232C-MIDI1
  8102.     move.l    a1,d0
  8103.     beq    1f
  8104.     addq.l    #1,d0        *d0=-1?
  8105.     beq    @f
  8106.     move.l    a1,m_out_r0+2-work(a6)
  8107.     move.l    a2,_m_out_r0+2-work(a6)
  8108.     bsr    cache_flush
  8109. @@:
  8110.     lea    m_out_r0+6-work(a6),a0
  8111.     move.l    #_m_out_r0+6,d0
  8112.     rts
  8113. 1:
  8114.     move.l    #m_out_r0+6,m_out_r0+2-work(a6)
  8115.     move.l    #_m_out_r0+6,_m_out_r0+2-work(a6)
  8116.     bsr    cache_flush
  8117.     t_dat_ok
  8118. hfsr1:                *RS232C-MIDI2
  8119.     move.l    a1,d0
  8120.     beq    1f
  8121.     addq.l    #1,d0        *d0=-1?
  8122.     beq    @f
  8123.     move.l    a1,m_out_r1+2-work(a6)
  8124.     move.l    a2,_m_out_r1+2-work(a6)
  8125.     bsr    cache_flush
  8126. @@:
  8127.     lea    m_out_r1+6-work(a6),a0
  8128.     move.l    #_m_out_r1+6,d0
  8129.     rts
  8130. 1:
  8131.     move.l    #m_out_r1+6,m_out_r1+2-work(a6)
  8132.     move.l    #_m_out_r1+6,_m_out_r1+2-work(a6)
  8133.     bsr    cache_flush
  8134.     t_dat_ok
  8135.  
  8136. hook_zmd_service:        *ZMD(演奏データ/共通コマンド/制御コマンド)処理のフック
  8137.     *   cmd=$6c
  8138.     * < d1.lw=ZMD code
  8139.     * < d1.hw=device(0:FM,1:ADPCM,2:MIDI,
  8140.     *        -1:COMMON ZMD,-2:COMMON ZMD of SE side,
  8141.     *        -3:CONTROL ZMD)
  8142.     * < a1.l=new user's job address(-1:ask mode)
  8143.     * > d0.l=0:no error
  8144.     * > a0.l=original job address
  8145.     move.l    d1,d0
  8146.     bmi    case_hk_cmn        *case common cmd
  8147.     swap    d0
  8148.     add.w    d0,d0            *2倍
  8149.     add.w    d0,d0            *4倍
  8150.     move.l    hzstbl0(pc,d0.w),d0
  8151.     lea    (a6,d0.l),a2
  8152.     cmpi.w    #255,d1
  8153.     bhi    t_illegal_zmd_code    *未定義のZMDの処理内容を書き換えようとしました
  8154.     add.w    d1,d1
  8155.     add.w    d1,d1
  8156.     move.l    (a2,d1.w),a0        *a0.l=original address
  8157.     cmp.l    #-1,a1
  8158.     beq    t_dat_ok        *case:ask mode
  8159.     move.l    a1,(a2,d1.w)
  8160.     t_dat_ok
  8161. hzstbl0:
  8162.     dc.l    int_cmd_tbl_fm-work
  8163.     dc.l    int_cmd_tbl_ad-work
  8164.     dc.l    int_cmd_tbl_md-work
  8165. case_hk_cmn:                *共通コマンドの機能書き換え
  8166.     swap    d0            *-1~-3
  8167.     neg.w    d0            *1~3
  8168.     subq.w    #1,d0            *0-2
  8169.     lsl.w    #3,d0            *8倍
  8170.     cmp.w    hzstbl1+6(pc,d0.w),d1
  8171.     bcc    t_illegal_zmd_code    *未定義のZMDの処理内容を書き換えようとしました
  8172.     move.l    hzstbl1(pc,d0.w),d0
  8173.     lea    (a6,d0.l),a2
  8174.     add.w    d1,d1
  8175.     add.w    d1,d1
  8176.     move.l    (a2,d1.w),a0        *a0.l=original address
  8177.     cmp.l    #-1,a1
  8178.     beq    t_dat_ok        *case:ask mode
  8179.     move.l    a1,(a2,d1.w)
  8180.     t_dat_ok
  8181. hzstbl1:
  8182.     dc.l    cmncmdjtbl-work,n4_of_cmn_cmd
  8183.     dc.l    cmncmdjtbl_se-work,n4_of_cmn_cmd
  8184.     dc.l    ctrl_cmd_tbl-work,n4_of_ctrl_cmd
  8185.  
  8186. store_error:                    *エラー情報の蓄積格納
  8187.     *   cmd=$6e
  8188.     * < d1.l=error code(-1のときは問い合わせのみ)
  8189.     *    (エラーの発生したファンクション番号(0-32767)*65536+エラーの種類(0-65535))
  8190.     * < d2.l=n_of_errに幾つ加算するか
  8191.     * > a0.l=エラーストックバッファのアドレス
  8192.     * > d0.l=現在ストックしているエラー情報の個数
  8193.     cmpi.l    #-1,d1                *問い合わせのみの場合
  8194.     beq    @f
  8195.     move.l    d1,d0
  8196.     bsr    set_err_code
  8197.     add.l    d2,n_of_err-work(a6)
  8198. @@:
  8199.     move.l    n_of_err-work(a6),d0        *戻り値
  8200.     move.l    err_stock_addr-work(a6),a0
  8201.     rts
  8202.  
  8203. print_error:                    *エラーの表示/出力
  8204.     *   cmd=$6f
  8205.     * < d1.hw=output mode(0:screen,1:buffer)    (Be used in ZMSC0)
  8206.     * < d1.lw=language mode(0:English,1:Japanese)
  8207.     * < d2.l=num. of err/warn
  8208.     * < a1.l=ZMD filename(ない場合は0)
  8209.     * < a2.l=source address(ない場合は0)
  8210.     * < a3.l=source filename(ない場合は0)
  8211.     * < a5.l=error table addr.
  8212.     * > a0.l=出力バッファ(endcod=0)(if d1.l==1)    (Be used in ZMSC0)
  8213.     * > d0.l=出力バッファサイズ(endcode含まず)
  8214.     * - all
  8215.     movem.l    d2/a5,-(sp)
  8216.     suba.l    a5,a5            *default
  8217.     moveq.l    #0,d7            *文字バッファ使用サイズ=0
  8218.     btst.l    #16,d1            *d1.hwチェック(0:画面出力か、1:バッファ出力か)
  8219.     beq    @f
  8220.     move.l    #1024,d2
  8221.     move.l    #ID_TEMP,d3
  8222.     bsr    get_mem
  8223.     tst.l    d0
  8224.     bmi    t_out_of_memory
  8225.     move.l    a0,a5
  8226.     move.l    d2,prterr_size-work(a6)
  8227. @@:
  8228.     movem.l    (sp)+,d2/a0
  8229.     bsr    do_prt_err_mes
  8230.     move.l    d7,d0
  8231.     move.l    a5,a0
  8232.     rts
  8233.  
  8234. PUTCHAR    macro
  8235.     local    ptch0
  8236.     local    ptch1
  8237.     move.l    a5,d0
  8238.     beq    ptch0
  8239.     bsr    putchar_
  8240.     bra    ptch1
  8241. ptch0:
  8242.     DOS    _PUTCHAR
  8243. ptch1:
  8244.     endm
  8245.  
  8246. PRINT    macro
  8247.     local    prt0
  8248.     local    prt1
  8249.     move.l    a5,d0
  8250.     beq    prt0
  8251.     bsr    print_
  8252.     bra    prt1
  8253. prt0:
  8254.     DOS    _PRINT
  8255. prt1:
  8256.     endm
  8257.  
  8258. reglist    reg    d2/a0-a1
  8259.  
  8260. putchar_:
  8261.     movem.l    reglist,-(sp)
  8262.     lea    zero(pc),a1        *endcodeにポイント
  8263.     move.b    5+12(sp),(a5,d7.l)
  8264.     bra    prta1_00
  8265.  
  8266. print_:
  8267.     movem.l    reglist,-(sp)
  8268.     move.l    4+12(sp),a1
  8269.     bra    prta1_lp
  8270.  
  8271. prta1_:                    *出力
  8272.     move.l    a5,d0
  8273.     bne    @f
  8274.     pea    (a1)
  8275.     DOS    _PRINT
  8276.     addq.w    #4,sp
  8277.     rts
  8278. @@:
  8279.     movem.l    reglist,-(sp)
  8280. prta1_lp:
  8281.     move.b    (a1)+,(a5,d7.l)
  8282. prta1_00:
  8283.     beq    @f
  8284.     addq.l    #1,d7
  8285.     cmp.l    prterr_size(pc),d7
  8286.     bcs    prta1_lp
  8287.     move.l    #1024,d2
  8288.     add.l    prterr_size(pc),d2
  8289.     move.l    a5,a1
  8290.     bsr    enlarge_mem
  8291.     tst.l    d0
  8292.     bmi    t_out_of_memory
  8293.     move.l    a0,a5
  8294.     move.l    d2,prterr_size-work(a6)
  8295.     bra    prta1_lp
  8296. @@:
  8297.     movem.l    (sp)+,reglist
  8298.     rts
  8299.  
  8300. *----------------------------------------
  8301.     *t_系のコマンドのエラーは
  8302.     *d0.hb=エラー発生ファンクション番号(-1はDEV_OUT時に発生)
  8303.     *d0.lb=エラーコード
  8304.     *a0.l=0
  8305.     *で表現される
  8306.     *スタックの調整はこちらで行う
  8307. *----------------------------------------
  8308. t_dat_ok:    moveq.l    #0,d0        *正常終了
  8309.         rts
  8310. t_dat_ok2:    moveq.l    #0,d0        *正常終了 #2
  8311.         move.l    d0,a0
  8312.         rts
  8313.  
  8314. t_illegal_channel:        err    ILLEGAL_CHANNEL
  8315. t_illegal_track_number:        err    ILLEGAL_TRACK_NUMBER
  8316. t_illegal_tone_number:        err    ILLEGAL_TONE_NUMBER
  8317. t_illegal_note_length:        err    ILLEGAL_NOTE_LENGTH
  8318. t_device_offline:        err    DEVICE_OFFLINE
  8319. t_illegal_data_size:        err    ILLEGAL_DATA_SIZE
  8320. t_illegal_part_number:        err    ILLEGAL_PART_NUMBER
  8321. t_illegal_note_number:        err    ILLEGAL_NOTE_NUMBER
  8322. t_illegal_timbre_number:    err    ILLEGAL_TIMBRE_NUMBER
  8323. t_illegal_string_length:    err    ILLEGAL_STRING_LENGTH
  8324. t_illegal_parameter_format:    err    ILLEGAL_PARAMETER_FORMAT
  8325. t_illegal_parameters_combination:    err    ILLEGAL_PARAMETERS_COMBINATION
  8326. t_illegal_parameter_value:    err    ILLEGAL_PARAMETER_VALUE
  8327. t_empty_timbre_number:        err    EMPTY_TIMBRE_NUMBER
  8328. t_empty_note_number:        err    EMPTY_NOTE_NUMBER
  8329. t_offset_too_long:        err    OFFSET_TOO_LONG
  8330. t_processing_size_too_large:    err    PROCESSING_SIZE_TOO_LARGE
  8331. t_unidentified_file:        err    UNIDENTIFIED_FILE
  8332. t_unmanageable_data_sequence:    err    UNMANAGEABLE_DATA_SEQUENCE
  8333. t_illegal_wave_number:        err    ILLEGAL_WAVE_NUMBER
  8334. t_no_application_registered    err    NO_APPLICATION_REGISTERED
  8335. t_illegal_result_code        err    ILLEGAL_RESULT_CODE
  8336. t_no_zmd_err:            err    NO_ZMD_ERROR
  8337. t_unidentified_memory:        err    UNIDENTIFIED_MEMORY
  8338. t_compiler_not_available:    err    COMPILER_NOT_AVAILABLE
  8339. t_compile_error:        err    COMPILE_ERROR
  8340. t_illegal_zmd_code:        err    ILLEGAL_ZMD_CODE
  8341. t_illegal_function_number:    err    ILLEGAL_FUNCTION_NUMBER
  8342. t_no_performance_data:        err    NO_PERFORMANCE_DATA
  8343. t_no_timbre_parameters        err    NO_TIMBRE_PARAMETERS
  8344. t_illegal_interface_number    err    ILLEGAL_INTERFACE_NUMBER
  8345. t_device_already_occupied:    err    THE_DEVICE_ALREADY_OCCUPIED
  8346. t_illegal_memory_block_size:    err    ILLEGAL_MEMORY_BLOCK_SIZE
  8347. t_out_of_memory:
  8348.     move.l    #ID_TEMP,d3
  8349.     bsr    free_mem2
  8350.     err    OUT_OF_MEMORY
  8351.  
  8352. t_file_not_found:            *ファイルネームをサブ情報としてもつ
  8353.     move.l    fnc_no(pc),d0
  8354.     move.w    #FILE_NOT_FOUND,d0
  8355.     bra    @f
  8356.  
  8357. t_illegal_file_size:            *ファイルネームをサブ情報としてもつ
  8358.     move.l    fnc_no(pc),d0
  8359.     move.w    #ILLEGAL_FILE_SIZE,d0
  8360.     bra    @f
  8361.  
  8362. t_read_error:                *ファイルネームをサブ情報としてもつ
  8363.     move.l    fnc_no(pc),d0
  8364.     move.w    #READ_ERROR,d0
  8365. @@:
  8366.     move.l    d0,-(sp)
  8367.     bsr    set_err_code
  8368.     move.l    fopen_name(pc),d0
  8369.     bsr    set_err_code        *set error code(fopenで最後に取り扱ったfilename)
  8370.     moveq.l    #0,d0
  8371.     bsr    set_err_code        *set error code(dummy)
  8372.     bsr    set_err_code        *set error code(dummy)
  8373.     bra    inc_n_of_err
  8374.  
  8375. t_error_code_exit:            *d0.lがそのままエラーコード
  8376.     * < d0.l=error code
  8377.     move.l    d0,-(sp)
  8378.     bsr    set_err_code        *set error code
  8379.     moveq.l    #0,d0
  8380.     bsr    set_err_code        *set error code(dummy)
  8381.     bsr    set_err_code        *set error code(dummy)
  8382.     bsr    set_err_code        *set error code(dummy)
  8383. inc_n_of_err:
  8384.     addq.l    #1,n_of_err-work(a6)
  8385.     bsr    do_fclose        *openしているファイルがあればそれを閉じる
  8386. *    bsr    play_beep
  8387.     suba.l    a0,a0            *error mark
  8388.     move.l    (sp)+,d0
  8389.     bset.l    #31,d0            *error mark
  8390.     move.l    sp_buf-work(a6),sp
  8391.     move.l    fnc_quit_addr-work(a6),-(sp)
  8392.     rts
  8393.  
  8394. set_err_code:                *エラーコードのストック
  8395. reglist    reg    d0-d4/a0-a1
  8396.     movem.l    reglist,-(sp)
  8397.     move.l    d0,d4            *main info
  8398.     tst.l    n_of_err-work(a6)
  8399.     bne    case_erstk_enlg
  8400.     tst.l    err_stock_addr-work(a6)
  8401.     bne    store_ercd
  8402.     move.l    #ID_ERROR,d3
  8403.     move.l    #256,d2            *初期値は256バイト
  8404.     bsr    get_mem
  8405.     tst.l    d0
  8406.     bmi    exit_sec
  8407.     move.l    d2,err_stock_size-work(a6)
  8408.     move.l    a0,err_stock_addr-work(a6)
  8409.     bra    store_ercd_
  8410. store_ercd:
  8411.     move.l    err_stock_next(pc),a0
  8412. store_ercd_:
  8413.     move.l    d4,(a0)+        *エラー情報格納
  8414.     move.l    a0,err_stock_next-work(a6)
  8415. exit_sec:
  8416.     movem.l    (sp)+,reglist
  8417.     rts
  8418. case_erstk_enlg:            *メモリ領域拡大の場合
  8419.     move.l    err_stock_next(pc),a0
  8420.     move.l    err_stock_addr(pc),a1
  8421.     add.l    err_stock_size(pc),a1
  8422.     cmp.l    a1,a0
  8423.     bcs    store_ercd_
  8424.     sub.l    err_stock_addr(pc),a0
  8425.     move.l    a0,d1            *d1.l=現在の書き込み目的オフセット
  8426.     move.l    err_stock_addr(pc),a1
  8427.     move.l    err_stock_size(pc),d2
  8428.     add.l    #256,d2            *もう256バイト確保
  8429.     move.l    d2,err_stock_size-work(a6)
  8430.     jsr    enlarge_mem-work(a6)
  8431.     tst.l    d0
  8432.     bmi    exit_sec
  8433.     move.l    a0,err_stock_addr-work(a6)
  8434.     add.l    d1,a0
  8435.     bra    store_ercd_
  8436.  
  8437.     .include    prterrms.has
  8438.     .include    zmerrmes.s    *エラーメッセージ
  8439.     .even
  8440.  
  8441. chk_kanji:
  8442.     tst.b    d0
  8443.     bpl    @f        *normal characters
  8444.     cmpi.b    #$a0,d0        *漢字か
  8445.     bcs    cknj_yes
  8446.     cmpi.b    #$df,d0
  8447.     bls    @f
  8448. cknj_yes:
  8449.     move.w    #CCR_NEGA,ccr    *yes
  8450.     rts
  8451. @@:
  8452.     move.w    #CCR_ZERO,ccr    *no
  8453.     rts
  8454.  
  8455. get_mem:            *メモリの確保
  8456.     *   cmd=$70
  8457.     * < d2.l=memory size
  8458.     * < d3.l=employment
  8459.     * > d0.l=memory block address (or error code/ depends on _S_MALLOC)
  8460.     * > d2.l=long word border size
  8461.     * > a0.l=data address
  8462.     * - all
  8463. reglist    reg    d1
  8464.     move.l    reglist,-(sp)
  8465.     move.w    sr,-(sp)
  8466.     ori.w    #$0700,sr
  8467.     addq.l    #3,d2
  8468.     andi.w    #$fffc,d2    *make it long word border
  8469.     move.l    d2,d1
  8470.     beq    1f
  8471.     addq.l    #8,d1        *add header size
  8472.     move.l    d1,-(sp)
  8473.     clr.w    -(sp)
  8474.     DOS    _S_MALLOC
  8475.     addq.w    #6,sp
  8476.     tst.l    d0
  8477.     bmi    @f
  8478.     move.l    d0,a0
  8479.     move.l    a0work-work(a6),-12(a0)    *親書き換え(強引)
  8480.     move.l    #ID_ZMSC,(a0)+    *IDをセット
  8481.     move.l    d3,(a0)+    *使用目的をセット
  8482.     move.w    (sp)+,sr
  8483.     move.l    (sp)+,reglist
  8484.     rts
  8485. @@:
  8486.     move.w    (sp)+,sr
  8487.     move.l    (sp)+,reglist
  8488.     bra    t_out_of_memory
  8489. 1:
  8490.     move.w    (sp)+,sr
  8491.     move.l    (sp)+,reglist
  8492.     bra    t_illegal_memory_block_size
  8493.  
  8494. enlarge_mem:            *メモリブロックの拡大縮小
  8495.     *   cmd=$71
  8496.     * < d2.l=new memory size
  8497.     * < a1.l=now address
  8498.     * > d0.l=address (0:done it, error/ depends on _S_MALLOC)
  8499.     * > d2.l=long word border size
  8500.     * > a0.l=address
  8501.     * - all
  8502. reglist    reg    d1/a1-a2
  8503.     movem.l    reglist,-(sp)
  8504.     move.w    sr,-(sp)
  8505.     ori.w    #$0700,sr
  8506.     addq.l    #3,d2
  8507.     andi.w    #$fffc,d2    *Make it long word border
  8508.     move.l    d2,d1
  8509.     beq    err_exit_enlmm1
  8510.     addq.l    #8,d1
  8511.     move.l    a1,a0
  8512.     move.l    d1,-(sp)
  8513.     pea    -8(a1)
  8514.     DOS    _SETBLOCK
  8515.     addq.w    #8,sp
  8516.     tst.l    d0
  8517.     beq    exit_enlmm    *no error
  8518.     move.l    d1,-(sp)    *SETBLOCK出来ない時は新たにメモリ確保
  8519.     clr.w    -(sp)
  8520.     DOS    _S_MALLOC
  8521.     addq.w    #6,sp
  8522.     tst.l    d0
  8523.     bmi    err_exit_enlmm2    *error
  8524.     move.l    d0,a0
  8525.     move.l    a0work-work(a6),-12(a0)    *親書き換え(強引)
  8526.     move.l    -8(a1),(a0)+    *IDをセット
  8527.     move.l    -4(a1),(a0)+    *使用目的をセット
  8528.     move.l    a0,a2
  8529.     pea    -8(a1)
  8530.     move.l    d2,d0
  8531. *    addq.l    #3,d0
  8532. *    andi.w    #$fffc,d0
  8533. @@:                *旧メモリ内容を新メモリエリアへ複写
  8534.     move.l    (a1)+,(a2)+
  8535.     subq.l    #4,d0
  8536.     bne    @b
  8537.     DOS    _S_MFREE    *メモリ開放
  8538.     addq.w    #4,sp
  8539. exit_enlmm:
  8540.     move.w    (sp)+,sr
  8541.     movem.l    (sp)+,reglist
  8542.     rts
  8543. err_exit_enlmm1:
  8544.     move.w    (sp)+,sr
  8545.     movem.l    (sp)+,reglist
  8546.     bra    t_illegal_memory_block_size
  8547. err_exit_enlmm2:
  8548.     move.w    (sp)+,sr
  8549.     movem.l    (sp)+,reglist
  8550.     bra    t_out_of_memory
  8551.  
  8552. free_mem:            *メモリブロックの解放
  8553.     *   cmd=$72
  8554.     * < a1.l=data address
  8555.     * > d0.l=0 no error
  8556.     * - a1
  8557.     move.l    a1,-(sp)
  8558.     cmpi.l    #ID_ZMSC,-8(a1)
  8559.     bne    err_frmm
  8560.     pea    -8(a1)
  8561.     DOS    _S_MFREE
  8562.     addq.w    #4,sp
  8563.     tst.l    d0
  8564.     bne    _err_frmm        *case error
  8565.     move.l    -4(a1),d0
  8566.     cmp.l    #ID_ZMD,d0
  8567.     bne    @f
  8568.     bsr    free_ZMD_mem
  8569.     bra    exit_frmm
  8570. @@:
  8571.     cmp.l    #ID_ERROR,d0
  8572.     bne    @f
  8573.     bsr    free_ERROR_mem
  8574.     bra    exit_frmm
  8575. @@:
  8576.     cmp.l    #ID_ZPD,d0
  8577.     bne    @f
  8578.     bsr    free_ZPD_mem
  8579.     bsr    adpcm_tbl_init
  8580.     bra    exit_frmm
  8581. @@:
  8582.     cmp.l    #ID_ZPD_TBL,d0
  8583.     bne    @f
  8584.     bsr    free_ZPD_TBL_mem
  8585.     bra    exit_frmm
  8586. @@:
  8587.     cmp.l    #ID_WAVE,d0
  8588.     bne    @f
  8589.     bsr    free_WAVE_mem
  8590.     bra    exit_frmm
  8591. @@:
  8592.     cmp.l    #ID_WAVE_TBL,d0
  8593.     bne    @f
  8594.     bsr    free_WAVE_TBL_mem
  8595.     bra    exit_frmm
  8596. @@:
  8597.     cmp.l    #ID_FMSND,d0
  8598.     bne    @f
  8599.     bsr    free_FMSND_mem
  8600. *    bra    exit_frmm
  8601. @@:
  8602. exit_frmm:
  8603.     moveq.l    #0,d0
  8604.     move.l    (sp)+,a1
  8605.     rts
  8606. err_frmm:
  8607.     moveq.l    #-1,d0
  8608. _err_frmm:
  8609.     move.l    (sp)+,a1
  8610.     rts
  8611.  
  8612. free_ZMD_mem:
  8613.     moveq.l    #0,d0
  8614.     move.l    d0,trk_buffer_top-work(a6)
  8615.     move.l    d0,trk_po_tbl-work(a6)
  8616.     move.l    d0,pattern_trk-work(a6)
  8617.     move.l    a1,-(sp)
  8618.     move.l    play_trk_tbl(pc),a1
  8619.     move.w    #-1,(a1)            *初期化
  8620.     move.l    play_bak(pc),a1
  8621.     move.w    #-1,(a1)            *初期化
  8622.     move.l    (sp)+,a1
  8623.     rts
  8624.  
  8625. free_ERROR_mem:
  8626.     moveq.l    #0,d0
  8627.     move.l    d0,n_of_err-work(a6)
  8628.     move.l    d0,err_stock_addr-work(a6)
  8629.     rts
  8630.  
  8631. free_ZPD_mem:
  8632.     moveq.l    #0,d0
  8633.     move.b    d0,zpd_last_fn+30-work(a6)
  8634.     cmp.l    adpcm_buffer_top-work(a6),a1
  8635.     bne    @f
  8636.     move.l    d0,adpcm_buffer_top-work(a6)
  8637. @@:
  8638.     rts
  8639.  
  8640. free_ZPD_TBL_mem:
  8641.     moveq.l    #0,d0
  8642.     cmp.l    adpcm_tbl-work(a6),a1
  8643.     bne    @f
  8644.     move.l    d0,adpcm_tbl-work(a6)
  8645.     move.l    d0,adpcm_n_max-work(a6)
  8646.     rts
  8647. @@:
  8648.     cmp.l    adpcm_tbl2-work(a6),a1
  8649.     beq    @f
  8650.     move.l    d0,adpcm_tbl2-work(a6)
  8651.     move.l    d0,adpcm_n_max2-work(a6)
  8652. @@:
  8653.     rts
  8654.  
  8655. free_WAVE_mem:
  8656.     moveq.l    #0,d0
  8657.     cmp.l    wave_memory_top-work(a6),a1
  8658.     bne    @f
  8659.     move.l    d0,wave_memory_top-work(a6)
  8660. @@:
  8661.     rts
  8662.  
  8663. free_ZPD_mem2:
  8664.     moveq.l    #0,d0
  8665.     move.b    d0,adpb_clr-work(a6)
  8666.     move.l    d0,adpcm_buffer_top-work(a6)
  8667.     move.b    d0,zpd_last_fn+30-work(a6)
  8668.     rts
  8669.  
  8670. free_ZPD_TBL_mem2:
  8671.     moveq.l    #0,d0
  8672.     move.l    d0,adpcm_tbl-work(a6)
  8673.     move.l    d0,adpcm_n_max-work(a6)
  8674.     move.l    d0,adpcm_tbl2-work(a6)
  8675.     move.l    d0,adpcm_n_max2-work(a6)
  8676.     rts
  8677.  
  8678. free_WAVE_mem2:
  8679.     moveq.l    #0,d0
  8680.     move.b    d0,wvmm_clr-work(a6)
  8681.     move.l    d0,wave_memory_top-work(a6)
  8682.     rts
  8683.  
  8684. free_WAVE_TBL_mem:
  8685.     cmp.l    wave_tbl-work(a6),a1
  8686.     bne    @f
  8687. free_WAVE_TBL_mem2:
  8688.     moveq.l    #0,d0
  8689.     move.l    d0,wave_tbl-work(a6)
  8690.     move.l    d0,wave_n_max-work(a6)
  8691. @@:
  8692.     rts
  8693.  
  8694. free_FMSND_mem:
  8695.     moveq.l    #0,d0
  8696.     move.l    d0,fmsnd_buffer-work(a6)
  8697.     move.w    d0,fmsnd_n_max-work(a6)
  8698.     rts
  8699.  
  8700. free_mem2:            *メモリブロックの解放 その2(使用用途識別開放)
  8701.     *   cmd=$73
  8702.     * < d3.l=employment ID(0:ALL)
  8703.     * > d0.l:0 no error, ne:error
  8704.     * - all
  8705.     movem.l    d1/a1,-(sp)
  8706.     moveq.l    #-1,d1
  8707.     move.l    fstmem(pc),a1
  8708.     move.l    a1,d0
  8709.     bne    @f
  8710.     bsr    get_fstmem        *メモリブロックの最初を求める
  8711. @@:
  8712. frmm2lp:
  8713.     move.l    12(a1),d0
  8714.     beq    all_end_frmm2    *all end
  8715.     move.l    d0,a1
  8716.     cmpi.l    #ID_ZMSC,16(a1)
  8717.     bne    frmm2lp
  8718.     tst.l    d3        *all ZmSc
  8719.     beq    @f
  8720.     cmp.l    20(a1),d3    *ID CHECK
  8721.     bne    frmm2lp
  8722. @@:
  8723.     pea    16(a1)
  8724.     DOS    _S_MFREE
  8725.     addq.w    #4,sp
  8726.     moveq.l    #0,d1
  8727.     bra    frmm2lp
  8728. all_end_frmm2:
  8729.     tst.l    d1
  8730.     bne    exit_frmm2        *err case
  8731.     tst.l    d3
  8732.     bne    @f            *All freeだったか
  8733.     bsr    free_ZMD_mem
  8734.     bsr    free_ERROR_mem
  8735.     bsr    free_ZPD_mem2
  8736.     bsr    free_ZPD_TBL_mem2
  8737.     bsr    free_WAVE_mem2
  8738.     bsr    free_WAVE_TBL_mem2
  8739.     bsr    free_FMSND_mem
  8740.     bra    exit_frmm2
  8741. @@:
  8742.     cmp.l    #ID_ZMD,d3
  8743.     bne    @f
  8744.     bsr    free_ZMD_mem
  8745.     bra    exit_frmm2
  8746. @@:
  8747.     cmp.l    #ID_ERROR,d3
  8748.     bne    @f
  8749.     bsr    free_ERROR_mem
  8750.     bra    exit_frmm2
  8751. @@:
  8752.     cmp.l    #ID_ZPD,d3
  8753.     bne    @f
  8754.     bsr    free_ZPD_mem2
  8755.     bsr    adpcm_tbl_init
  8756.     bra    exit_frmm2
  8757. @@:
  8758.     cmp.l    #ID_ZPD_TBL,d3
  8759.     bne    @f
  8760.     bsr    free_ZPD_TBL_mem2
  8761.     bra    exit_frmm2
  8762. @@:
  8763.     cmp.l    #ID_WAVE,d3
  8764.     bne    @f
  8765.     bsr    free_WAVE_mem2
  8766.     bra    exit_frmm2
  8767. @@:
  8768.     cmp.l    #ID_WAVE_TBL,d3
  8769.     bne    @f
  8770.     bsr    free_WAVE_TBL_mem2
  8771.     bra    exit_frmm2
  8772. @@:
  8773.     cmp.l    #ID_FMSND,d3
  8774.     bne    @f
  8775.     bsr    free_FMSND_mem
  8776. *    bra    exit_frmm2
  8777. @@:
  8778. exit_frmm2:
  8779.     move.l    d1,d0            *error code
  8780.     movem.l    (sp)+,d1/a1
  8781.     rts
  8782.  
  8783. get_fstmem:
  8784.     move.l    a0work(pc),a1
  8785. @@:                *メモリブロックの先頭アドレスを求める
  8786.     move.l    (a1),d0
  8787.     beq    @f
  8788.     move.l    d0,a1
  8789.     bra    @b
  8790. @@:
  8791.     move.l    a1,fstmem-work(a6)
  8792.     rts
  8793.  
  8794. exchange_memid:            *メモリブロックのIDの変更
  8795.     *   cmd=$74
  8796.     * < a1.l=mem.block address
  8797.     * < d1.l=mode    (0:no check) (1:check mode) (-1:exchange all who got d2 id.) 
  8798.     * < d2.l=old ID (Can be omitted in 'no check' case.)
  8799.     * < d3.l=New ID ($8000_0000 means lock mem.)($0000_0000 means unlock mem.)
  8800.     * > d0.l=return (0:no error, ne:error)
  8801.     * - all except d0,a0
  8802. reglist    reg    d1/a1
  8803.     movem.l    reglist,-(sp)
  8804.     tst.l    d1
  8805.     beq    @f
  8806.     bmi    exgmmid_repeat_mode
  8807.     cmp.l    #ID_ZMSC,-8(a1)
  8808.     bne    exit_em_err
  8809.     move.l    -4(a1),d0
  8810.     bclr.l    #31,d0
  8811.     cmp.l    d0,d2
  8812.     bne    exit_em_err
  8813. @@:
  8814.     tst.l    d3
  8815.     beq    unlock0
  8816.     cmpi.l    #ID_LOCK,d3
  8817.     bne    @f
  8818.     or.l    d3,-(a1)        *lock case
  8819.     movem.l    (sp)+,reglist
  8820.     t_dat_ok
  8821. @@:
  8822.     move.l    d3,-(a1)        *exchange case
  8823.     movem.l    (sp)+,reglist
  8824.     t_dat_ok
  8825. unlock0:
  8826.     andi.l    #$7fff_ffff,-(a1)    *unlock case
  8827.     movem.l    (sp)+,reglist
  8828.     t_dat_ok
  8829. exit_em_err
  8830.     movem.l    (sp)+,reglist
  8831.     bra    t_unidentified_memory
  8832.  
  8833. exgmmid_repeat_mode:        *d2.lで示されるIDを持つメモリブロックのIDを全てd3へ置き換える
  8834.     moveq.l    #-1,d1
  8835.     move.l    fstmem(pc),a1
  8836.     move.l    a1,d0
  8837.     bne    @f
  8838.     bsr    get_fstmem        *メモリブロックの最初を求める
  8839. @@:
  8840. exmmlp:
  8841.     move.l    12(a1),d0
  8842.     beq    exit_exmmid
  8843.     move.l    d0,a1
  8844.     cmpi.l    #ID_ZMSC,16(a1)
  8845.     bne    exmmlp
  8846.     move.l    20(a1),d0
  8847.     bclr.l    #31,d0
  8848.     cmp.l    d0,d2        *ID CHECK
  8849.     bne    exmmlp
  8850.     tst.l    d3
  8851.     beq    unlock1
  8852.     cmpi.l    #ID_LOCK,d3
  8853.     bne    @f
  8854.     or.l    d3,20(a1)    *lock case
  8855.     moveq.l    #0,d1
  8856.     bra    exmmlp
  8857. @@:
  8858.     move.l    d3,20(a1)    *exchange case
  8859.     moveq.l    #0,d1
  8860.     bra    exmmlp
  8861. unlock1:
  8862.     andi.l    #$7fff_ffff,20(a1)    *unlock case
  8863.     moveq.l    #0,d1
  8864.     bra    exmmlp
  8865. exit_exmmid:
  8866.     move.l    d1,d0        *error code
  8867.     movem.l    (sp)+,d1/a1
  8868.     rts
  8869.  
  8870. init_all:            *ドライバの初期化
  8871.     *   cmd=$78
  8872.     * > d0.l=Version ID
  8873.     tst.b    no_init_mode-work(a6)
  8874.     beq    @f
  8875.     move.w    #RTS,d0
  8876.     move.w    d0,init_inst_fm-work(a6)
  8877.     move.w    d0,init_inst_ad-work(a6)
  8878.     move.w    d0,init_inst_md-work(a6)
  8879. @@:
  8880.     moveq.l    #0,d1
  8881.     bsr    current_midi_in
  8882.     moveq.l    #0,d1
  8883.     bsr    current_midi_out
  8884.     bsr    init_midibd
  8885.     moveq.l    #$fe,d0            *dummy
  8886.     jsr    m_out_r0-work(a6)
  8887.     clr.b    zpd_last_fn+30-work(a6)
  8888. *    clr.b    cnf_last_fn+30-work(a6)
  8889. *    clr.b    mbd_last_fn+30-work(a6)
  8890.     move.l    m_play00,m_play00_bak-work(a6)
  8891.     bsr    wave_tbl_init
  8892.     bsr    adpcm_tbl_init
  8893.     bsr    fmsnd_init
  8894.     jsr    mr_init-work(a6)    *乱数初期化
  8895.     jbsr    m_init
  8896.     bsr    init_se_wk
  8897.     bsr    set_new_t_max_min
  8898.     bsr    set_new_t_max_min_se
  8899.     move.b    zmsc_mode-work(a6),d1
  8900.     bsr    zmusic_mode
  8901.     bsr    init_global_fmopmprms    *FM音源グローバルパラメータ初期化
  8902.     move.w    #$0403,d1        *frq/pan
  8903.     moveq.l    #num_of_80,d2        *length
  8904.     lea    dummy_data,a1
  8905.     IOCS    _ADPCMOUT        *ダミー再生
  8906.     moveq.l    #0,d0
  8907.     move.w    ver_num,d0
  8908.     rts
  8909.  
  8910. init_global_fmopmprms:
  8911.     lea    opmset-work(a6),a4
  8912.     move.w    sr,-(sp)
  8913.     ori.w    #$0700,sr
  8914.     move.b    OPMCTRL.w,d1
  8915.     andi.b    #$fc,d1
  8916.     move.b    d1,d2
  8917.     moveq.l    #$1b,d1                *WF=0
  8918.     jsr    (a4)
  8919.     move.w    (sp)+,sr
  8920.     moveq.l    #1,d1
  8921.     moveq.l    #2,d2                *HARD LFO RESET
  8922.     jsr    (a4)
  8923.     moveq.l    #0,d2                *HARD LFO START
  8924.     jsr    (a4)
  8925.     moveq.l    #$19,d1
  8926.     moveq.l    #$80,d2                *PMD=0
  8927.     jsr    (a4)
  8928.     moveq.l    #0,d2                *AMD=0
  8929.     jsr    (a4)
  8930.     moveq.l    #$18,d1                *LFRQ=0
  8931.     jsr    (a4)
  8932.     moveq.l    #15,d1                *NE=0,NFRQ=0
  8933.     jmp    (a4)
  8934.  
  8935. mr_p:    equ    89        *乱数用シード
  8936. mr_q:    equ    38        *乱数用シード
  8937. mr_init:            *乱数発生初期化ルーチン
  8938.     movem.l    d0-d3/a0-a2,-(sp)
  8939.     lea.l    exec,a0
  8940.     lea.l    $1_0000,a1
  8941.     move.l    estbn(pc),a2
  8942.     moveq.l    #20-1,d3
  8943. @@:                *乱数シード作成(適当)
  8944.     move.l    (a0)+,d0
  8945.     move.l    (a1)+,d2
  8946.     rol.l    #8,d0
  8947.     eor.l    d2,d0
  8948.     move.l    d0,(a2)+
  8949.     dbra    d3,@b
  8950.                 *乱数生成テーブル作成
  8951.     move.l    #(mr_p/16)+1,d1
  8952.     moveq    #((mr_p/16)+1)*16-mr_p,d2    *shift counter
  8953.     move.l    estbn(pc),a1
  8954.     lea    (mr_p/16)*2(a1),a0
  8955.     move.w    (a0)+,d1
  8956.     move.w    -4(a0),d0
  8957.     lsl.w    d2,d1
  8958.     move.w    (a1),d3
  8959.     lsr.w    d2,d3
  8960.     eor.w    d0,d3
  8961.     or.w    d3,d1
  8962.     move.w    d1,-2(a0)
  8963.  
  8964.     moveq.l    #(mr_p-((mr_p/16)+1))-1,d3
  8965. @@:
  8966.     move.w    (a1)+,d0
  8967.     lsl.w    d2,d0
  8968.     move.w    (a1),d1
  8969.     lsr.w    d2,d1
  8970.     or.w    d1,d0
  8971.     move.w    -2(a0),d1
  8972.     eor.w    d1,d0
  8973.     move.w    d0,(a0)+
  8974.     dbra    d3,@b
  8975.  
  8976.     move.l    estbn(pc),a0
  8977.     lea    (mr_p-mr_q)*2(a0),a1
  8978.     movem.l    a0-a1,mr_xp-work(a6)
  8979.     movem.l    (sp)+,d0-d3/a0-a2
  8980.     rts
  8981.  
  8982. fmsnd_init:                *音色バッファの初期化
  8983.     movem.l    d1-d2/a1-a2,-(sp)
  8984.     move.w    fmsnd_n_max(pc),d1
  8985.     beq    exit_fmsnd_init
  8986.     lea    preset_fmsnd(pc),a1    *src
  8987.     movea.l    fmsnd_buffer(pc),a2    *dest
  8988.     moveq.l    #fmsnd_size/4-1,d2
  8989. @@:
  8990.     move.l    (a1)+,(a2)+
  8991.     dbra    d2,@b
  8992.  
  8993.     movea.l    fmsnd_buffer(pc),a1    *src
  8994.     lea    fmsnd_size(a1),a2    *dest
  8995.     subq.w    #1,d1
  8996.     mulu    #fmsnd_size/4,d1
  8997.     subq.w    #1,d1            *for dbra
  8998.     bcs    exit_fmsnd_init
  8999. @@:
  9000.     move.l    (a1)+,(a2)+
  9001.     dbra    d1,@b
  9002. exit_fmsnd_init:
  9003.     movem.l    (sp)+,d1-d2/a1-a2
  9004.     rts
  9005.  
  9006. preset_fmsnd:            *音色バッファの初期データ
  9007.     dc.b    0,0
  9008.     ds.b    30
  9009.     ds.b    16
  9010. preset_fmsnd_end_:
  9011.     .even
  9012.  
  9013. init_se_wk:
  9014.     movem.l    d0-d2/d4/a5,-(sp)
  9015.     clr.l    mask_preserve-work(a6)        *マスクを初期化して演奏するマーク
  9016.     movea.l    seq_wk_tbl_se(pc),a5
  9017.     move.w    se_tr_max(pc),d2
  9018.     subq.w    #1,d2
  9019.     bcs    exit_isw
  9020.     moveq.l    #0,d4        *p_type,p_ch=0
  9021. @@:
  9022.     jbsr    init_wks
  9023.     move.b    #ID_DEAD,p_track_stat(a5)
  9024.     lea    trwk_size(a5),a5
  9025.     dbra    d2,@b
  9026. exit_isw:
  9027.     movem.l    (sp)+,d0-d2/d4/a5
  9028.     rts
  9029.  
  9030. int_start:            *割り込みの開始制御
  9031.     *   cmd=$79
  9032.     * < d1.w=-1    音楽タイマ 
  9033.     * < d1.w=0    音楽/効果音タイマ 
  9034.     * < d1.w=1    効果音タイマ 
  9035.     ori.w    #$0700,sr
  9036.     tst.w    d1
  9037.     bmi    _init_timer
  9038.     bne    init_timer_se
  9039.     bsr    _init_timer
  9040.     bra    init_timer_se
  9041.  
  9042. int_stop:            *割り込みの停止制御
  9043.     *   cmd=$7a
  9044.     * < d1.w=-1    音楽タイマ 
  9045.     * < d1.w=0    音楽/効果音タイマ 
  9046.     * < d1.w=1    効果音タイマ 
  9047.     tst.w    d1
  9048.     bmi    stop_timer
  9049.     bne    stop_timer_se
  9050.     bsr    stop_timer
  9051.     bra    stop_timer_se
  9052.  
  9053. set_int_service:        *ユーザ割り込みサービスの設定
  9054.     *   cmd=$7b
  9055.     *設定時
  9056.     *     < d1.hw=全音符のクロック数
  9057.     *     < d1.lw=音楽テンポ
  9058.     *     < a1.l=ユーザー割り込みエントリ
  9059.     *    > d0.l=0:done    d0.l=-1:先約有り,a0.l=ルーチンエントリアドレス
  9060.     *テンポの変更
  9061.     *     < d1.hw=全音符のクロック数
  9062.     *     < d1.lw=音楽テンポ
  9063.     *    < a1.l=-1
  9064.     *    > d0.l=0:正常終了    d0.l=-1:失敗
  9065.     *検査時
  9066.     *     < d1.l=-1
  9067.     *    < a1.l=0
  9068.     *    > d0.l=0:空き,a0.l=0    d0.l=-1:先約有り,a0.l=ルーチンエントリアドレス
  9069.     *解除時
  9070.     *     < d1.l=0
  9071.     *     < a1.l=ユーザー割り込みエントリ
  9072.     *     > d0.l=0:done    d0.l=-1:解除不可能
  9073.     * x d0-d2/a0-a1
  9074.     ori.w    #$0700,sr
  9075.     move.l    a1,d0
  9076.     beq    sis_detect    *検査
  9077.     cmpa.l    #-1,a1
  9078.     beq    sis_tempo    *テンポ変更
  9079.     cmpi.l    #-1,d1
  9080.     beq    sis_detect    *検査
  9081.     tst.l    d1
  9082.     beq    sis_release    *解除
  9083.  
  9084.     cmp.l    #int_dummy,sub_job_entry-work(a6)
  9085.     bne    error_sis        *先約有り
  9086.     tst.b    timer_mode-work(a6)    *(A:-1/B:0/M:1)
  9087.     beq    can_use_tm_a
  9088.     bpl    can_use_tm_b2
  9089. can_use_tm_b:                        *タイマAをシステムが使っている
  9090.                             *タイマBをユーザー割り込みに当てる
  9091.     move.w    #%0001_1111,tm_a_reset-work(a6)
  9092.     move.w    #%0010_1111,tm_b_reset-work(a6)
  9093.     move.w    #%0011_1111,tm_ab_reset-work(a6)
  9094.     move.l    a1,sub_job_entry-work(a6)
  9095. tm_b_chng:                    *テンポだけ変更する場合のエントリ
  9096.     move.l    d1,d2
  9097.     tempo_range    d2,_se
  9098.     move.w    mst_clk(pc),-(sp)        *便宜上
  9099.     swap    d1
  9100.     move.w    d1,mst_clk-work(a6)
  9101.     move.w    d2,tempo_value_se-work(a6)
  9102.     bsr    calc_timer_se            *>d1.l=timer value
  9103.     bmi    @f
  9104.     bsr    init_timer_se
  9105. @@:
  9106.     move.w    (sp)+,mst_clk-work(a6)
  9107.     t_dat_ok
  9108. can_use_tm_b2:                    *MIDIタイマをシステムが使っている
  9109.                         *タイマBをユーザー割り込みに当てる
  9110.     cmp.l    #$fe0000,$10c.w
  9111.     bcs    error_sis            *先約有り
  9112.     st.b    opm_vect-work(a6)
  9113.     move.l    a1,sub_job_entry-work(a6)
  9114.     move.w    #%0000_1010,tm_a_reset-work(a6)
  9115.     move.w    #%0010_1010,tm_b_reset-work(a6)
  9116.     move.w    #%0010_1010,tm_ab_reset-work(a6)
  9117.     lea    int_entry_f-work(a6),a1
  9118.     IOCS    _OPMINTST
  9119. tm_b2_chng:                    *テンポだけ変更する場合のエントリ
  9120.     move.l    d1,d2
  9121.     tempo_range    d2,_se
  9122.     move.w    mst_clk(pc),-(sp)        *便宜上
  9123.     swap    d1
  9124.     move.w    d1,mst_clk-work(a6)
  9125.     move.w    d2,tempo_value_se-work(a6)
  9126.     bsr    calc_timer_se            *>d1.l=timer value
  9127.     bmi    @f
  9128.     bsr    init_timer_se
  9129. @@:
  9130.     move.w    (sp)+,mst_clk-work(a6)
  9131.     t_dat_ok
  9132. can_use_tm_a:                        *タイマBをシステムが使っている
  9133.                             *タイマAをユーザー割り込みに当てる
  9134.     move.w    #%0001_1111,tm_a_reset-work(a6)
  9135.     move.w    #%0010_1111,tm_b_reset-work(a6)
  9136.     move.w    #%0011_1111,tm_ab_reset-work(a6)
  9137.     move.l    a1,sub_job_entry-work(a6)
  9138. tm_a_chng:                    *テンポだけ変更する場合のエントリ
  9139.     move.l    d1,d2
  9140.     tempo_range    d2,_se
  9141.     move.w    mst_clk(pc),-(sp)        *便宜上
  9142.     swap    d1
  9143.     move.w    d1,mst_clk-work(a6)
  9144.     move.w    d2,tempo_value_se-work(a6)
  9145.     bsr    calc_timer_se            *>d1.l=timer value
  9146.     bmi    @f
  9147.     bsr    init_timer_se
  9148. @@:
  9149.     move.w    (sp)+,mst_clk-work(a6)
  9150.     t_dat_ok
  9151.  
  9152. sis_release                    *解除
  9153.     cmp.l    sub_job_entry-work(a6),a1
  9154.     bne    error_sis            *エントリが違うので解除は出来ない
  9155.     tst.b    timer_mode-work(a6)        *(A:-1/B:0/M:1)
  9156.     beq    release_tm_a
  9157.     bpl    release_tm_b2
  9158. release_tm_b:                    *タイマAをシステムが使っている
  9159.     bsr    stop_timer_b            *タイマBのユーザー割り込みを解除
  9160.     move.w    #%0001_0101,tm_a_reset-work(a6)    *タイマAのみが有効になるような設定に戻す
  9161.     move.w    #%0000_0101,tm_b_reset-work(a6)
  9162.     move.w    #%0001_0101,tm_ab_reset-work(a6)
  9163.     lea    int_dummy(pc),a1
  9164.     move.l    a1,sub_job_entry-work(a6)
  9165.     t_dat_ok
  9166. release_tm_b2:                    *MIDIタイマをシステムが使っている
  9167.     bsr    stop_timer_b
  9168.     clr.w    tm_a_reset-work(a6)        *FM音源タイマが死ぬような設定にする
  9169.     clr.w    tm_b_reset-work(a6)
  9170.     clr.w    tm_ab_reset-work(a6)
  9171.     lea    int_dummy(pc),a1
  9172.     move.l    a1,sub_job_entry-work(a6)
  9173.     clr.b    opm_vect-work(a6)
  9174.     suba.l    a1,a1
  9175.     IOCS    _OPMINTST
  9176.     t_dat_ok
  9177. release_tm_a:                    *タイマBをシステムが使っている
  9178.     bsr    stop_timer_a            *タイマAのユーザー割り込みを解除
  9179.     move.w    #%0000_1010,tm_a_reset-work(a6)    *タイマBのみが有効になるような設定に戻す
  9180.     move.w    #%0010_1010,tm_b_reset-work(a6)
  9181.     move.w    #%0010_1010,tm_ab_reset-work(a6)
  9182.     lea    int_dummy(pc),a1
  9183.     move.l    a1,sub_job_entry-work(a6)
  9184.     t_dat_ok
  9185.  
  9186. sis_detect                *検査
  9187.     suba.l    a0,a0
  9188.     cmp.l    #int_dummy,sub_job_entry-work(a6)
  9189.     beq    t_dat_ok        *あき
  9190. error_sis:
  9191.     move.l    sub_job_entry(pc),a0
  9192.     moveq.l    #-1,d0
  9193.     rts
  9194.  
  9195. sis_tempo:                *テンポ変更
  9196.     cmp.l    #int_dummy,sub_job_entry-work(a6)
  9197.     beq    error_sis            *ルーチンなにもない
  9198.     tst.b    timer_mode-work(a6)        *(A:-1/B:0/M:1)
  9199.     beq    tm_a_chng
  9200.     bmi    tm_b_chng
  9201.                         *MIDIタイマをシステムが使っている
  9202.     cmp.l    #$fe0000,$10c.w            *タイマBをユーザー割り込みに当てる
  9203.     bcc    error_sis            *ルーチンなにもない
  9204.     bra    tm_b2_chng
  9205.  
  9206. control_tempo:        *テンポ設定の主導権設定
  9207.     *   cmd=$7c
  9208.     * < d1.l=-1    テンポ設定の主導権を外部アプリケーションに委託
  9209.     * < d1.l=0    テンポ設定主導権を奪還(内部パラメタでテンポ初期化も行う)
  9210.     ori.w    #$0700,sr
  9211.     tst.l    d1
  9212.     beq    ctrl_tempo_off
  9213.             *テンポ設定の主導権を外部アプリケーションに委託
  9214.     tas.b    tempo_mode-work(a6)
  9215.     bne    t_dat_ok
  9216.     lea    ctrl_tempo_bak(pc),a1
  9217.     move.l    wrt_tmp(pc),(a1)+
  9218.     move.w    #RTS,init_timer-work(a6)
  9219.     move.l    #NOP_NOP,wrt_tmp-work(a6)
  9220.     bsr    cache_flush
  9221.     t_dat_ok
  9222.  
  9223. ctrl_tempo_off:        *テンポ設定主導権を奪還(内部パラメタでテンポ初期化も行う)
  9224.     bclr.b    #7,tempo_mode-work(a6)
  9225.     beq    t_dat_ok
  9226.     lea    ctrl_tempo_bak(pc),a1
  9227.     move.w    #NOP,init_timer-work(a6)
  9228.     move.l    (a1)+,wrt_tmp-work(a6)
  9229.     bsr    cache_flush
  9230.     bsr    init_timer
  9231.     t_dat_ok
  9232.  
  9233. zmusic_mode:        *ZMUSICモード切り換え
  9234.     *   cmd=$7e
  9235.     * < d1.l=mode(2:Ver.2.0 mode,3:Ver.3.0 mode,-1:ask)
  9236.     * > d0.l=0:DONE -1:SAME
  9237.     * > d0.l=last mode(< d1.l=-1のときのみ)
  9238.     * x d1,a0,a1,a2
  9239.     tst.b    d1
  9240.     bmi    ask_zmsc3_mode
  9241.     cmpi.b    #3,d1
  9242.     bcs    zmusic_mode_v2
  9243.     bne    zmsc3_mode_notouch
  9244.                             *Version 3.0xモード
  9245.     move.b    d1,zmsc_mode-work(a6)
  9246.     lea    mode_patch_bkup-work(a6),a0
  9247.     move.w    (a0)+,pmod_wvmm_patch-work(a6)
  9248.     move.w    (a0)+,arcc_wvmm_patch-work(a6)
  9249.     move.w    (a0)+,frq_mpcm_patch
  9250.     move.w    (a0)+,datatype_mpcm_patch
  9251.     move.w    (a0)+,exit_gsg-work(a6)
  9252.     move.w    (a0)+,get_def_velo-work(a6)
  9253.     lea    v3_volume_tbl(pc),a1
  9254.     lea    vol_tbl2-work(a6),a2
  9255.     moveq.l    #17-1,d0
  9256. @@:
  9257.     move.b    (a1)+,(a2)+
  9258.     dbra    d0,@b
  9259. mpcm_patch1:
  9260.     lea    mpcm_vol_tbl-work(a6),a1
  9261.     moveq.l    #-1,d1
  9262.     move.w    #M_SET_VOLTBL,d0
  9263.     MPCM_call
  9264. _mpcm_patch1:
  9265.     jsr    cache_flush-work(a6)
  9266.     t_dat_ok
  9267. zmsc3_mode_notouch:
  9268.     moveq.l    #-1,d0
  9269.     rts
  9270.  
  9271. zmusic_mode_v2                        *Version 2.0xモード
  9272.     move.b    d1,zmsc_mode-work(a6)
  9273.     patch_w    BRA,pmod_wvmm_patch,store_pmod_wvmm    *波形メモリ振幅考慮無し
  9274.     patch_w    BRA,arcc_wvmm_patch,store_arcc_wvmm
  9275.     move.w    #NOP,frq_mpcm_patch
  9276.     move.w    #NOP,datatype_mpcm_patch
  9277.     move.w    #NOP,exit_gsg-work(a6)
  9278.     move.w    #NOP,get_def_velo-work(a6)
  9279.     lea    v2_volume_tbl(pc),a1
  9280.     lea    vol_tbl2-work(a6),a2
  9281.     moveq.l    #17-1,d0
  9282. @@:
  9283.     move.b    (a1)+,(a2)+
  9284.     dbra    d0,@b
  9285. mpcm_patch2:
  9286.     moveq.l    #1,d1
  9287.     move.w    #M_SET_VOLTBL,d0
  9288.     MPCM_call
  9289. _mpcm_patch2:
  9290.     jsr    cache_flush-work(a6)
  9291.     t_dat_ok
  9292.  
  9293. v2_volume_tbl:
  9294.     dc.b        0,7,15,23,31,39,47,55,63,71,79,87,95,103,111,119,127
  9295. v3_volume_tbl:
  9296.     dc.b        0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,127
  9297.     .even
  9298.  
  9299. ask_zmsc3_mode:
  9300.     moveq.l    #0,d0
  9301.     move.b    zmsc_mode-work(a6),d0
  9302.     rts
  9303.  
  9304. exec_zmd:        *ZMD列の実行
  9305.     *   cmd=$7f
  9306.     * < d1.l=トラック番号(0-65534,65535:特に指定しない場合)
  9307.     * < d2.l=ZMD列の長さ(1~)
  9308.     * < a1.l=ZMD列格納アドレス(バッファ自体はd2.l+8の大きさを必要とする)
  9309.     ori.w    #$700,sr
  9310.     move.l    play_trk_tbl-work(a6),a3
  9311. @@:
  9312.     moveq.l    #0,d0
  9313.     move.w    (a3)+,d0
  9314.     cmpi.w    #-1,d0
  9315.     beq    t_illegal_track_number
  9316.     cmpi.w    #-1,d1            *特に指定しない場合
  9317.     beq    @f
  9318.     cmp.w    d0,d1
  9319.     bne    @b
  9320. @@:
  9321.     calc_wk    d0            *>a5=seq_wk_tbl n
  9322.     move.l    p_data_pointer(a5),d0
  9323.     lea    (a1,d2.l),a3
  9324.     move.b    #skip_zmd,(a3)+        *zmd
  9325.     move.b    #1,(a3)+        *mode
  9326.     rept    4
  9327.     rol.l    #8,d0
  9328.     move.b    d0,(a3)+
  9329.     endm
  9330.     move.l    a1,p_data_pointer(a5)    *ジャンプ先登録
  9331.     rts
  9332. *-----------------------------------------------------------------------------
  9333. func_end:
  9334.  
  9335. init_play_wk:            *演奏ワークの初期化
  9336.     movem.l    d0-d2/d4/a5,-(sp)
  9337.     move.w    trk_n_max(pc),d2
  9338.     beq    exit_ipw
  9339.     movea.l    seq_wk_tbl(pc),a5
  9340.     subq.w    #1,d2        *for dbra
  9341.     moveq.l    #0,d4        *p_type,p_ch=0
  9342. @@:
  9343.     jsr    init_wks
  9344.     move.b    #ID_DEAD,p_track_stat(a5)    *off
  9345.     clr.l    p_now_pointer(a5)
  9346.     lea    trwk_size(a5),a5
  9347.     dbra    d2,@b
  9348. exit_ipw:
  9349.     movem.l    (sp)+,d0-d2/d4/a5
  9350.     rts
  9351.  
  9352. init_inst_fm:                *case:FM
  9353.     * < d4.l=type,ch
  9354.     * < a4.l=opmset
  9355.     * - all
  9356. reglist    reg    d1-d2
  9357.     bset.b    d4,ii_fm_bit-work(a6)
  9358.     bne    1f
  9359.     movem.l    reglist,-(sp)
  9360.     move.w    sr,-(sp)
  9361.     ori.w    #$0700,sr
  9362.     moveq.l    #$38,d1            *PMS/AMS
  9363.     add.b    d4,d1
  9364.     moveq.l    #0,d2
  9365.     jsr    (a4)
  9366.     cmpi.w    #7,d4            *FM8チャンネル目
  9367.     bne    @f
  9368.     moveq.l    #15,d1            *fm ch=8ならnoiseパラメータも設定
  9369.     jsr    (a4)
  9370. @@:
  9371.     move.w    (sp)+,sr
  9372.     movem.l    (sp)+,reglist
  9373. 1:
  9374.     rts
  9375.  
  9376. init_inst_ad:                *ADPCM初期化
  9377.     * < d4.l=type,ch
  9378.     * < a5.l=seq wk n
  9379.     * - all
  9380. reglist        reg    d0-d4/a1
  9381.     movem.l    reglist,-(sp)
  9382.     move.w    ii_ad_bit(pc),d3
  9383.     bset.l    d4,d3
  9384.     bne    exit_adii
  9385.     move.w    d3,ii_ad_bit-work(a6)
  9386.     move.b    p_frq(a5),d1
  9387.     jsr    do_adpcm_frq        *周波数
  9388.     move.b    p_pan(a5),d2
  9389.     jsr    do_adpcm_pan
  9390. adii_patch:                *no mpcm でパッチ(bra exit_adii)
  9391.     move.b    p_vol(a5),d0
  9392.     andi.w    #$7f,d0
  9393.     bsr    consider_fader_ad
  9394.     jsr    do_ad_volume-work(a6)        *音量
  9395.     move.w    p_detune(a5),d1
  9396.     jsr    set_ad_tune
  9397.     lea    zero(pc),a1        *dummy((a1).b=0)
  9398.     moveq.l    #0,d1            *table type
  9399.     move.w    #M_SET_PCM,d0
  9400.     move.b    d4,d0
  9401.     MPCM_call
  9402. exit_adii:
  9403.     movem.l    (sp)+,reglist
  9404.     rts
  9405.  
  9406. ii_bit_work:
  9407. ii_fm_bit:    dc.w    0
  9408. ii_ad_bit:    dc.w    0
  9409. ii_m0_bit:    dc.w    0
  9410. ii_m1_bit:    dc.w    0
  9411. ii_mr0_bit:    dc.w    0
  9412. ii_mr1_bit:    dc.w    0
  9413.  
  9414. init_inst_md:                *MIDIのケース
  9415.     * < d4.l=type,ch
  9416.     * < a5.l=seq wk n
  9417.     * - all
  9418. reglist        reg    d0-d4/a1-a2/a4
  9419.     movem.l    reglist,-(sp)
  9420.     move.l    d4,d0
  9421.     swap    d0
  9422.     add.w    d0,d0
  9423.     move.l    p_midi_trans(a5),a2
  9424.     lea    ii_m0_bit(pc,d0.w),a4
  9425.     move.w    (a4),d3
  9426.     bset.l    d4,d3
  9427.     bne    exit_ii
  9428.     move.w    d3,(a4)
  9429.     moveq.l    #$b0,d2
  9430.     or.b    d4,d2        *program change($cn)
  9431.     move.b    d2,d0
  9432.     jsr    (a2)
  9433.  
  9434.     lea    initmidiouttbl(pc),a1
  9435. @@:
  9436.     move.b    (a1)+,d0
  9437.     bmi    @f
  9438.     jsr    (a2)
  9439.     bra    @b
  9440. @@:
  9441.     moveq.l    #$65,d0
  9442.     jsr    (a2)        *RPN H
  9443.     moveq.l    #$00,d0
  9444.     jsr    (a2)
  9445.  
  9446.     moveq.l    #$64,d0
  9447.     jsr    (a2)        *RPN L
  9448.     moveq.l    #$00,d0
  9449.     jsr    (a2)
  9450.  
  9451.     moveq.l    #$06,d0        *PITCH BEND RANGEを設定する
  9452.     jsr    (a2)
  9453.     move.b    p_@b_range(a5),d0
  9454.     jsr    (a2)
  9455.  
  9456.     moveq.l    #$07,d0
  9457.     jsr    (a2)
  9458.     move.b    p_vol(a5),d0
  9459.     jsr    (a2)        *volume set
  9460.  
  9461.     moveq.l    #10,d0
  9462.     jsr    (a2)
  9463.     move.b    p_pan(a5),d0
  9464.     jsr    (a2)        *panpot set
  9465.  
  9466.     moveq.l    #64,d0
  9467.     jsr    (a2)
  9468.     move.b    p_damper(a5),d0
  9469.     jsr    (a2)        *damper
  9470.  
  9471.     add.b    #$30,d2        *bender($en)
  9472.     move.b    d2,d0
  9473.     jsr    (a2)
  9474.     move.w    p_detune(a5),d0
  9475.     add.w    #8192,d0
  9476.     move.w    d0,d1
  9477.     andi.b    #127,d0        *lower.b
  9478.     lsr.w    #7,d1        *higher.b
  9479.     jsr    (a2)        *lower @b
  9480.     move.b    d1,d0
  9481.     jsr    (a2)        *higher @b
  9482. exit_ii:
  9483.     movem.l    (sp)+,reglist
  9484.     rts
  9485.  
  9486. initmidiouttbl:
  9487.     dc.b    $79,$00        *reset all controllers
  9488.     dc.b    $7c,0        *omni mode off
  9489.     dc.b    $7f,0        *poly mode on
  9490.     dc.b    $7a,$7f        *local on
  9491.     dc.b    $65,0        *RPN H
  9492.     dc.b    $64,1        *RPN L
  9493.     dc.b    $06,$40        *FINE TUNINGをニュートラルへ(H)
  9494.     dc.b    $26,0        *FINE TUNINGをニュートラルへ(L)
  9495.     dc.b    $65,0        *RPN H
  9496.     dc.b    $64,2        *RPN L
  9497.     dc.b    $06,$40        *COURSE TUNINGをニュートラルへ
  9498.     dc.b    $01,$00        *modulation off
  9499.     dc.w    -1
  9500.  
  9501. all_key_off:                *全チャンネルをノートオフする
  9502.     * - all
  9503. reglist    reg    d0-d2/d4/a0/a2-a4
  9504.     movem.l    reglist,-(sp)
  9505.                     *FM
  9506.     moveq.l    #8-1,d4
  9507. @@:
  9508.     bsr    ako_fm
  9509.     dbra    d4,@b
  9510.     moveq.l    #15,d1
  9511.     moveq.l    #0,d2
  9512.     bsr    opmset            *NOISE OFF
  9513.                     *ADPCM
  9514.     moveq.l    #16-1,d4
  9515. @@:
  9516.     bsr    ako_adpcm
  9517.     dbra    d4,@b
  9518. nmdb9:                    *nmdb!!(patched to be bra exit_ako0)
  9519.                     *拡張MIDI部処理
  9520.     lea    midi_if_tbl(pc),a0
  9521. ako_lp01:
  9522.     moveq.l    #0,d0
  9523.     move.b    (a0)+,d0
  9524.     bmi    exit_ako0
  9525.     move.w    ako_j_tbl(pc,d0.w),d0
  9526.     lea    ako_j_tbl(pc,d0.l),a2
  9527.     moveq.l    #16-1,d4
  9528. @@:
  9529.     bsr    ako_midi
  9530.     dbra    d4,@b
  9531.     bra    ako_lp01
  9532. exit_ako0:
  9533.     movem.l    (sp)+,reglist
  9534.     rts
  9535. ako_j_tbl:
  9536.     dc.w    m_out_m0-ako_j_tbl
  9537.     dc.w    m_out_m1-ako_j_tbl
  9538.     dc.w    m_out_r0-ako_j_tbl
  9539.     dc.w    m_out_r1-ako_j_tbl
  9540.  
  9541. nmdb4:                    *nmdb!!(patched to be RTS)
  9542. ako_midi:
  9543.     moveq.l    #$b0,d0
  9544.     or.w    d4,d0
  9545.     jsr    (a2)
  9546.     moveq.l    #$78,d0
  9547.     jsr    (a2)
  9548.     moveq.l    #$00,d0
  9549.     jmp    (a2)                *all sound off
  9550.  
  9551. ako_fm:
  9552.     moveq.l    #8,d1
  9553.     move.l    d4,d2
  9554.     bsr    opmset            *fm key off
  9555.  
  9556. *    moveq.l    #$60,d1            *TL
  9557. *    add.w    d2,d1
  9558. *    moveq.l    #127,d2            *v=0
  9559. *    moveq.l    #4-1,d0
  9560. *@@:
  9561. *    bsr    opmset
  9562. *    addq.w    #8,d1
  9563. *    dbra    d0,@b
  9564.  
  9565.     moveq.l    #$e0,d1            *RR
  9566.     add.w    d2,d1
  9567.     moveq.l    #$ff,d2
  9568.     moveq.l    #4-1,d0
  9569. @@:
  9570.     bsr    opmset
  9571.     addq.w    #8,d1
  9572.     dbra    d0,@b
  9573.     rts
  9574.  
  9575. ako_adpcm:
  9576.     tst.b    se_mode-work(a6)
  9577.     bmi    @f
  9578. ako_ad_patch:                *STD PCMDRVの場合はパッチが当たる(bra adpcm_end)
  9579.     move.w    #M_KEY_OFF,d0
  9580.     move.b    d4,d0
  9581.     MPCM_call
  9582. @@:
  9583.     rts
  9584.  
  9585. top_ptr_set:            *データ領域の先頭アドレスをワークへセットする
  9586.     * < d0.l=trk_number
  9587.     * > a5.l=seq_wk_tbl n
  9588.     * x a4
  9589. reglist    reg    d0-d1/d4/a1-a2
  9590.     movem.l    reglist,-(sp)
  9591.     move.l    d0,d1
  9592.     calc_wk    d0
  9593.     movea.l    trk_po_tbl(pc),a2
  9594.     lsl.l    #trk_tbl_size_,d1
  9595.     add.l    d1,a2
  9596.     do_top_ptr_set    0
  9597.     movem.l    (sp)+,reglist
  9598.     rts
  9599.  
  9600. do_calc_tmm:
  9601.     * < d2.w=tempo_value.w=tempo
  9602.     * > d1.w=timer m value
  9603.     * d0,a1,a6破壊禁止
  9604.     move.l    d0,-(sp)
  9605.     move.l    #30*1000*1000,d0    *1分=60*1000000μs
  9606.     move.w    mst_clk(pc),d1
  9607.     mulu    d2,d1
  9608.     bsr    wari            *d0/d1=d0...d1
  9609.     move.l    d0,d1
  9610.     move.l    (sp)+,d0
  9611.     cmpi.l    #$3fff,d1
  9612.     bhi    @f
  9613.     andi.w    #$3fff,d1
  9614.     rts
  9615. @@:
  9616.     move.w    #$3fff,d1
  9617.     rts
  9618.  
  9619. do_calc_tmb:
  9620.     * < d2.w=tempo_value.w=tempo
  9621.     * > d1.w=timer a value
  9622.     * a1,a6破壊禁止
  9623.     move.l    d0,-(sp)
  9624.     lsl.w    #4,d2
  9625.  
  9626.     moveq.l    #0,d1
  9627.     move.w    mst_clk(pc),d1
  9628.     move.l    #(16*4000*60000)>>8,d0
  9629.     bsr    wari        *d0=d0/d1
  9630.                 *d0=16*4000*60000/(1024*(mst_clk/4))
  9631.     divu    d2,d0
  9632.     bvs    tmp_err
  9633.     swap    d0
  9634.     tst.w    d0        *余りがあるか
  9635.     beq    @f
  9636.     add.l    #$0001_0000,d0    *余りがあるなら切り上げ
  9637. @@:
  9638.     swap    d0        *d0.w=answer
  9639.     move.w    #256,d1
  9640.     sub.w    d0,d1
  9641.     bcc    @f
  9642.     moveq.l    #0,d1
  9643. @@:
  9644.     movem.l    (sp)+,d0    *わざとmovem
  9645.     rts
  9646.  
  9647. tmp_err:
  9648.     move.l    (sp)+,d0
  9649.     moveq.l    #-1,d1
  9650.     rts
  9651.  
  9652. calc_timer:            *テンポ値をタイマーの設定値へ変換しワークへセット
  9653.     movem.l    d0-d2,-(sp)
  9654.     move.w    tempo_value(pc),d2
  9655. calc_timer_patch:        *ここはタイマーモードによって書き変わる
  9656.     bsr.w    do_calc_tmm
  9657.     bmi    @f
  9658.     move.w    d1,timer_value-work(a6)
  9659. @@:
  9660.     movem.l    (sp)+,d0-d2
  9661.     rts
  9662.  
  9663. calc_timer_se:            *テンポ値をタイマーBの設定値へ変換しワークへセット
  9664.     movem.l    d0-d2,-(sp)
  9665.     move.w    tempo_value_se(pc),d2
  9666. calc_timer_se_patch:        *ここはタイマーモードによって書き変わる
  9667.     bsr.w    do_calc_tmb
  9668.     bmi    @f
  9669.     move.w    d1,timer_value_se-work(a6)
  9670. @@:
  9671.     movem.l    (sp)+,d0-d2
  9672.     rts
  9673.  
  9674. do_calc_tma:            *テンポ値(77~300)をタイマーAの設定値へ変換する
  9675.     * < d2.w=tempo_value.w=tempo
  9676.     * > d1.w=timer a value
  9677.     * a1,a6使用禁止
  9678.     move.l    d0,-(sp)
  9679.     moveq.l    #0,d1
  9680.     move.w    mst_clk(pc),d1
  9681.     move.l    #(16*4000*60000)>>8,d0
  9682.     bsr    wari        *d0=d0/d1
  9683.                 *d0=16*4000*60000/(1024*(mst_clk/4))
  9684.     divu    d2,d0
  9685.     bvs    tmp_err
  9686.     move.w    #1024,d1
  9687.     sub.w    d0,d1
  9688.     bcc    @f
  9689.     moveq.l    #0,d1
  9690. @@:
  9691.     movem.l    (sp)+,d0    *わざとmovem
  9692.     rts
  9693.  
  9694. init_timer_a_se:            *タイマーAの初期化
  9695.     move.w    sr,-(sp)
  9696.     ori.w    #$0700,sr
  9697.     move.w    timer_value_se(pc),d2    *timer A value
  9698.     moveq.l    #$11,d1
  9699.     bsr    opmset
  9700.     bra    ita00
  9701.  
  9702. init_timer_a:            *タイマーAの初期化
  9703.     move.w    timer_value(pc),d2    *timer A value
  9704. _init_timer_a:            *タイマーAの初期化
  9705.     * < d2.w=timer value
  9706.     move.w    sr,-(sp)
  9707.     ori.w    #$0700,sr
  9708.     moveq.l    #$11,d1
  9709.     bsr    opmset
  9710. ita00:
  9711.     moveq.l    #$10,d1
  9712.     lsr.w    #2,d2
  9713.     bsr    opmset
  9714.     move.w    tm_ab_reset(pc),d2
  9715.     ori.b    #%0011_0000,d2
  9716.     ori.b    #%0001_0101,timer_mask-work(a6)
  9717.     moveq.l    #$14,d1
  9718.     bsr    opmset
  9719.     bset.b    #b_tma_flg,timer_flg-work(a6)
  9720.     move.w    (sp)+,sr
  9721.     rts
  9722.  
  9723. init_timer:
  9724.     nop            *FNC control_tempoでパッチ(RTS)が当たる
  9725. _init_timer:            *使用タイマによってパッチが当たる
  9726. init_timer_m:            *MIDIタイマーの初期化
  9727.     move.w    sr,-(sp)
  9728.     ori.w    #$0700,sr
  9729.     pea    (a0)
  9730.     lea    rgr,a0
  9731.     move.w    timer_value(pc),d1
  9732.     ori.w    #$8000,d1
  9733.     move.b    #$8,(a0)
  9734.     midiwait
  9735.     move.b    d1,grp4-rgr(a0)
  9736.     midiwait
  9737.     ror.w    #8,d1
  9738.     move.b    d1,grp5-rgr(a0)
  9739.     midiwait
  9740.     clr.b    (a0)
  9741.     midiwait
  9742.     tas.b    r06_0-work(a6)    *int on
  9743.     move.b    r06_0(pc),grp6-rgr(a0)
  9744.     midiwait
  9745.     move.l    (sp)+,a0
  9746.     bset.b    #b_tmm_flg,timer_flg-work(a6)
  9747.     move.w    (sp)+,sr
  9748.     rts
  9749.  
  9750. init_timer_e:            *外部シーケンサがホスト
  9751.     move.w    sr,-(sp)
  9752.     ori.w    #$0700,sr
  9753.     pea    (a0)
  9754.     lea    rgr,a0
  9755.  
  9756.     move.b    #$07,(a0)
  9757.     midiwait
  9758.     move.b    itpl_rate-work(a6),grp5-rgr(a0)
  9759.     midiwait
  9760.  
  9761.     clr.b    (a0)
  9762.     midiwait
  9763.     ori.b    #%0000_0101,r06_0-work(a6)    *int on
  9764.     move.b    r06_0(pc),grp6-rgr(a0)
  9765.     midiwait
  9766.  
  9767.     move.l    (sp)+,a0
  9768.     bset.b    #b_tmm_flg,timer_flg-work(a6)
  9769.     move.w    (sp)+,sr
  9770.     rts
  9771.  
  9772. init_timer_se:                *使用タイマによってパッチが当たる
  9773. init_timer_b_se:            *タイマーBの初期化
  9774.     move.w    sr,-(sp)
  9775.     ori.w    #$0700,sr
  9776.     move.w    timer_value_se(pc),d2    *timer B value
  9777.     bra    itb00
  9778.  
  9779. init_timer_b:            *タイマーBの初期化
  9780.     move.w    timer_value(pc),d2    *timer B value
  9781. _init_timer_b:            *タイマーBの初期化
  9782.     * < d2.w=timer value
  9783.     move.w    sr,-(sp)
  9784.     ori.w    #$0700,sr
  9785. itb00:
  9786.     moveq.l    #$12,d1
  9787.     bsr    opmset
  9788.     move.w    tm_ab_reset(pc),d2
  9789.     ori.b    #%0011_0000,d2
  9790.     ori.b    #%0010_1010,timer_mask-work(a6)
  9791.     moveq.l    #$14,d1
  9792.     bsr    opmset
  9793.     bset.b    #b_tmb_flg,timer_flg-work(a6)
  9794.     move.w    (sp)+,sr
  9795.     rts
  9796.  
  9797. stop_timer_a:
  9798.     move.w    sr,-(sp)
  9799.     ori.w    #$0700,sr
  9800.     movem.l    d1-d2,-(sp)
  9801.     moveq.l    #$14,d1
  9802.     move.w    tm_ab_reset-work(a6),d2
  9803.     andi.b    #%0001_1010,d2
  9804.     andi.b    #%0011_1010,timer_mask-work(a6)
  9805.     bsr    opmset            *int mask
  9806.     bclr.b    #b_tma_flg,timer_flg-work(a6)
  9807.     movem.l    (sp)+,d1-d2
  9808.     move.w    (sp)+,sr
  9809.     rts
  9810.  
  9811. stop_timer_b:
  9812.     move.w    sr,-(sp)
  9813.     ori.w    #$0700,sr
  9814.     movem.l    d1-d2,-(sp)
  9815.     moveq.l    #$14,d1
  9816.     move.w    tm_ab_reset-work(a6),d2
  9817.     andi.b    #%0010_0101,d2
  9818.     andi.b    #%0011_0101,timer_mask-work(a6)
  9819.     bsr    opmset            *int mask
  9820.     bclr.b    #b_tmb_flg,timer_flg-work(a6)
  9821.     movem.l    (sp)+,d1-d2
  9822.     move.w    (sp)+,sr
  9823.     rts
  9824.  
  9825. stop_timer:                *使用タイマによってパッチが当たる
  9826.     * - all
  9827.     move.w    sr,-(sp)
  9828.     ori.w    #$0700,sr
  9829.     clr.b    rgr
  9830.     midiwait
  9831.     andi.b    #$7f,r06_0-work(a6)    *int stop
  9832.     move.b    r06_0(pc),grp6
  9833.     midiwait
  9834.     bclr.b    #b_tmm_flg,timer_flg-work(a6)
  9835.     move.w    (sp)+,sr
  9836.     rts
  9837.  
  9838. stop_timer_se:                *使用タイマによってパッチ(bra stop_timer_a)が当たる
  9839.     bra.w    stop_timer_b
  9840.  
  9841. play_beep:                *BEEP音を鳴らす
  9842.     move.w    sr,-(sp)
  9843.     ori.w    #$700,sr
  9844.     move.l    d0,-(sp)
  9845.     move.w    #$07,-(sp)
  9846.     clr.w    -(sp)
  9847.     DOS    _CONCTRL
  9848.     addq.w    #4,sp
  9849.     move.l    (sp)+,d0
  9850.     move.w    (sp)+,sr
  9851.     rts
  9852.  
  9853. copy_key:            *COPY key operation
  9854.     move.l    d0,-(sp)
  9855.     move.w    sr,d0
  9856.     andi.w    #$700,d0
  9857.     movem.l    (sp)+,d0    *わざとmovem
  9858.     bne    @f
  9859.     move.l    copy_org(pc),-(sp)
  9860.     rts
  9861. @@:
  9862.     rte
  9863.  
  9864. mk_capital:            *小文字→大文字(英字以外の場合はそのままthrough out)
  9865.     * < d0.b=letter chr
  9866.     cmpi.b    #'a',d0
  9867.     bcs    exit_mkcptl
  9868.     cmpi.b    #'z',d0
  9869.     bhi    exit_mkcptl
  9870.     andi.w    #$df,d0        *わざと.w
  9871. exit_mkcptl:
  9872.     rts
  9873.  
  9874. kakuchoshi:            *拡張子がなければ設定
  9875.     * < a0=filename address
  9876.     * < a1=拡張子アドレス
  9877.     * X a0
  9878.     bsr    skip_peri
  9879.     moveq.l    #91-1,d0
  9880. kkchs_lp:
  9881.     move.b    (a0)+,d0
  9882.     beq    do_kkchs
  9883.     cmpi.b    #'.',d0
  9884.     beq    find_period
  9885.     dbra    d0,kkchs_lp
  9886. do_kkchs:
  9887.     subq.l    #1,a0
  9888.     move.b    #'.',(a0)+
  9889.     move.b    (a1)+,(a0)+
  9890.     move.b    (a1)+,(a0)+
  9891.     move.b    (a1)+,(a0)+
  9892.     clr.b    (a0)
  9893.     rts
  9894. find_period:
  9895.     cmpi.b    #' ',(a0)
  9896.     bls    do_kkchs    *'.'はあっても拡張子がないケース
  9897.     rts
  9898.  
  9899.     .include    fopen.has
  9900.  
  9901. get_fsize2:            *ファイルサイズの偶数調整をする
  9902.     * < d5.w=file handle
  9903.     * > d3.l=data size
  9904.     * > mi=err
  9905.     * X d0
  9906.     * - d5
  9907.     move.w    #2,-(sp)    *ファィルの長さを調べる
  9908.     clr.l    -(sp)
  9909.     move.w    d5,-(sp)
  9910.     DOS    _SEEK
  9911.      addq.w    #8,sp        *d0.l=file length
  9912.     addq.l    #1,d0
  9913.     bclr.l    #0,d0        *.even
  9914.     bra    gf0
  9915.  
  9916. fname_chk:
  9917.     * < a3.l=last_fn addr
  9918.     * > eq=same
  9919.     * > mi=not same
  9920.     movem.l    d0/a0/a3,-(sp)
  9921.     lea.l    file_info_buf(pc),a0
  9922.     moveq.l    #53-1,d0
  9923. @@:
  9924.     cmpm.b    (a0)+,(a3)+
  9925.     bne    @f
  9926.     dbra    d0,@b
  9927.     moveq.l    #0,d0
  9928. @@:
  9929.     movem.l    (sp)+,d0/a0/a3
  9930.     rts
  9931.  
  9932. cache_flush:                *キャッシュのフラッシュ
  9933.     movem.l    d0-d1,-(sp)
  9934.     moveq.l    #3,d1
  9935.     IOCS    _SYS_STAT
  9936.     movem.l    (sp)+,d0-d1
  9937.     rts
  9938.  
  9939.     .include    work.s
  9940.     .include    zmsc2.has
  9941.  
  9942. bil_prta1:                *日本語対応
  9943.     tst.b    errmes_lang-work(a6)    *0:英語か 1:日本語か
  9944.     beq    prta1
  9945. @@:                    *次のメッセージをゲット
  9946.     tst.b    (a1)+
  9947.     bne    @b
  9948. prta1:
  9949.     move.w    #2,-(sp)
  9950.     pea    (a1)
  9951.     DOS    _FPUTS
  9952.     addq.w    #6,sp
  9953.     rts
  9954.  
  9955. dev_init:                *デバイスドライバとしての初期化
  9956.     movem.l    d1/a1/a6,-(sp)
  9957.     lea    work,a6
  9958.     lea    cannot_reg(pc),a1
  9959.     bsr    bil_prta1
  9960.     movem.l    (sp)+,d1/a1/a6
  9961.     jmp    not_com
  9962.  
  9963. exec:                *コマンドラインから実行した時
  9964.     lea    work,a6
  9965.     clr.l    -(sp)
  9966.     DOS    _SUPER            *スーパーバイザーへ
  9967.     addq.w    #4,sp
  9968.     move.l    d0,ssp-work(a6)
  9969.     move.l    sp,_sp_buf-work(a6)
  9970.  
  9971.     move.l    a0,a0work-work(a6)
  9972.     move.l    a1,a1work-work(a6)
  9973.  
  9974.     tst.b    $0cbc.w            *MPUが68000ならキャッシュフラッシュ必要無し
  9975.     bne    @f
  9976.     move.w    #RTS,cache_flush-work(a6)
  9977. @@:
  9978.     movea.l    a2,a4
  9979.     addq.w    #1,a4
  9980.  
  9981.     DOS    _VERNUM
  9982.     cmpi.w    #$0300,d0
  9983.     bcs    Human_ver_err
  9984.  
  9985.     bsr    chk_board        *CHECK MIDI BOARD
  9986.  
  9987.     bsr    get_work_area0        *> a1.l=last address of this prog.
  9988.     bne    resigned
  9989. *    lea    $10(a0),a0        *メモリブロックの変更
  9990. *    suba.l    a0,a1
  9991. *    pea    (a1)
  9992. *    pea    (a0)
  9993. *    DOS    _SETBLOCK
  9994. *    addq.w    #8,sp
  9995. *    tst.l    d0
  9996. *    bmi    resigned        *out of memory
  9997.  
  9998. *!    tst.b    -1(a4)            *スイッチ処理
  9999. *!    bne    @f
  10000.     pea    zmsc3_opt(pc)
  10001.     jsr    search_env-work(a6)
  10002.     addq.w    #4,sp
  10003.     tst.l    d0
  10004.     beq    @f
  10005.     move.l    a4,-(sp)
  10006.     move.l    d0,a4
  10007.     bsr    chk_optsw
  10008.     move.l    (sp)+,a4
  10009. @@:
  10010.     bsr    chk_optsw
  10011.  
  10012.     bsr    chk_drv
  10013.     beq    exit_ooZ        *すでに常駐している
  10014.  
  10015.     bsr    get_work_area1        *> a1.l=last address of this prog.
  10016.     move.l    a0work-work(a6),a0
  10017.     lea    $10(a0),a0        *メモリブロックの変更
  10018.     suba.l    a0,a1
  10019.     pea    (a1)
  10020.     pea    (a0)
  10021.     DOS    _SETBLOCK
  10022.     addq.w    #8,sp
  10023.     tst.l    d0
  10024.     bmi    resigned        *out of memory
  10025.  
  10026.     bsr    set_patch
  10027.  
  10028.     moveq.l    #trk_n_max_default,d5
  10029.     move.w    d5,trk_n_max-work(a6)
  10030.     jbsr    spread_trk_n
  10031.     bmi    resigned        *out of memory
  10032.  
  10033.     bsr    set_vect
  10034.     bne    exit_oo            *(既に登録住み)
  10035.     bsr    prt_keep_info
  10036.     bsr    set_dev_name
  10037.     bmi    unknown_err
  10038.     jsr    init_all-work(a6)
  10039.  
  10040.     tst.b    pcm_read_flg-work(a6)
  10041.     beq    @f
  10042.     bsr    do_block_read
  10043. @@:
  10044.     tst.b    stup_read_flg-work(a6)        *スタートアップファイルの読み込み
  10045.     beq    @f
  10046.     bsr    read_start_up
  10047. @@:
  10048.     move.l    ssp-work(a6),a1
  10049.     IOCS    _B_SUPER
  10050.  
  10051.     move.l    dev_end_adr-work(a6),d0
  10052.     lea    begin_of_prog,a0
  10053.     sub.l    a0,d0            *常駐サイズ
  10054.  
  10055.     clr.w    -(sp)
  10056.     move.l    d0,-(sp)        *for KEEPPR
  10057.     DOS    _KEEPPR            *常駐終了
  10058.  
  10059. unknown_err:
  10060.     lea    unknown_mes(pc),a1
  10061. err_exit:
  10062.     bsr    prt_title
  10063.     bsr    bil_prta1
  10064.     move.l    ssp-work(a6),a1
  10065.     IOCS    _B_SUPER    *ユーザーモードへ戻る
  10066.  
  10067.     move.w    #1,-(sp)
  10068.     DOS    _EXIT2
  10069.  
  10070. do_block_read:            *立ち上げ時にデータをリード
  10071.     lea    stup_zpdfn-work(a6),a1
  10072.     jsr    register_zpd-work(a6)
  10073.     tst.l    d0
  10074.     bne    exit_bdr
  10075. dbrp:
  10076.     bsr    mes_head
  10077.     lea    default_adp-work(a6),a1    *読み込み正常完了
  10078.     bra    bil_prta1
  10079. exit_bdr:
  10080.     bsr    mes_head
  10081.     lea    cannot_read-work(a6),a1
  10082.     bra    bil_prta1
  10083.  
  10084. mes_head:
  10085.     move.l    a1,-(sp)
  10086.     lea    read_mes1-work(a6),a1
  10087.     bsr    prta1
  10088.     lea    stup_zpdfn-work(a6),a1
  10089.     bsr    prta1
  10090.     move.l    (sp)+,a1
  10091.     rts
  10092.  
  10093. mes_head2:
  10094.     move.l    a1,-(sp)
  10095.     lea    read_mes2-work(a6),a1
  10096.     bsr    prta1
  10097.     lea    stup_fnsv-work(a6),a1
  10098.     bsr    prta1
  10099.     move.l    (sp)+,a1
  10100.     rts
  10101.  
  10102. read_start_up:                *立ち上げ時にデータをリード(その2)
  10103.     lea.l    stup_fnsv-work(a6),a2
  10104.     jsr    fopen-work(a6)        *(ret:d5=file handle)
  10105.     jsr    get_fsize-work(a6)    *>d3.l=size
  10106.     move.l    d3,d2
  10107.     move.l    d3,d4            *size(自己出力時に使用)
  10108.     move.l    #ID_STARTUP,d3
  10109.     jsr    get_mem-work(a6)    *>a0.l=address,d2.l=lw border length
  10110.     tst.l    d0
  10111.     bmi    su_not_ok
  10112.     move.l    a0,a4            *addr(自己出力時に使用)
  10113.  
  10114.     move.w    sr,-(sp)
  10115.     andi.w    #$f8ff,sr
  10116.     move.l    d4,-(sp)    *push size
  10117.     move.l    a4,-(sp)    *push addr
  10118.     move.w    d5,-(sp)    *file handle
  10119.     DOS    _READ        *サンプリングデータの読み込み
  10120.     lea    10(sp),sp
  10121.     move.w    (sp)+,sr
  10122.  
  10123.     move.w    d5,-(sp)    *close
  10124.     DOS    _CLOSE
  10125.     addq.w    #2,sp
  10126.  
  10127.     *.mddかどうかチェックする
  10128. @@:
  10129.     move.b    (a2)+,d0
  10130.     beq    not_mdd
  10131.     cmpi.b    #'.',d0
  10132.     bne    @b
  10133.     move.b    (a2)+,d0
  10134.     andi.b    #$df,d0
  10135.     cmpi.b    #'M',d0
  10136.     bne    not_mdd
  10137.     move.b    (a2)+,d0
  10138.     andi.b    #$df,d0
  10139.     cmpi.b    #'D',d0
  10140.     bne    not_mdd
  10141.     move.b    (a2)+,d0
  10142.     andi.b    #$df,d0
  10143.     cmpi.b    #'D',d0
  10144.     beq    nmdb10
  10145. not_mdd:
  10146.     pea    su_ok(pc)        *戻り番地
  10147.     movem.l    reg_zm_dev,-(sp)
  10148.     jmp    dev_out_chk
  10149. nmdb10:                    *nmdb!!
  10150.     cmpi.w    #$0d0a,(a4)        *header check
  10151.     bne    su_not_ok
  10152.     cmpi.b    #$1a,-1(a4,d4.l)    *endcode check
  10153.     bne    su_not_ok
  10154.     move.l    a4,a1
  10155.     moveq.l    #0,d2
  10156.     moveq.l    #-1,d1            *current MIDI I/F
  10157.     jbsr    midi_transmission
  10158. su_ok:                    *スタートアップ組み込み成功
  10159.     move.l    a4,a1
  10160.     jsr    free_mem-work(a6)
  10161. surp:                    *-GでRTSに
  10162.     bsr    mes_head2
  10163.     lea    default_adp-work(a6),a1    *読み込み正常完了
  10164.     bra    bil_prta1
  10165.  
  10166. su_not_ok:                *スタートアップ組み込み失敗
  10167.     bsr    mes_head2
  10168.     lea    cannot_read-work(a6),a1
  10169.     bra    bil_prta1
  10170.  
  10171. title_mes:            *使い捨てのワーク群(後にグローバルワークとして使用される)
  10172.     dc.b    'Z-MUSIC PERFORMANCE MANAGER '
  10173.     dc.b    $F3,'I',$F3,'N',$F3,'T',$F3,'E',$F3,'G',$F3,'R',$F3,'A',$F3,'L '
  10174.     dc.b    $F3,'V',$F3,'E',$F3,'R',$F3,'S',$F3,'I',$F3,'O',$F3,'N'
  10175.     version
  10176.     TEST
  10177.     dc.b    ' (C) 1991,97 '
  10178.     dc.b    'ZENJI SOFT',13,10,0
  10179. yes_midi:    dc.b    "MIDI/",0
  10180. no_midi:    dc.b    "FM・OPM/ADPCM are under the control of Z-MUSIC.",13,10,0
  10181.         dc.b    "FM・OPM/ADPCMがZ-MUSICの管理下に入りました.",13,10,0
  10182. no_midi_:    dc.b    "FM・OPM/ADPCM/MPCM.X are under the control of Z-MUSIC.",13,10,0
  10183.         dc.b    "FM・OPM/ADPCM/MPCM.XがZ-MUSICの管理下に入りました.",13,10,0
  10184. already_mes:    dc.b    'An application which cannot cooperate with Z-MUSIC has been included.',13,10,0
  10185.         dc.b    '協調不可能のアプリケーションが常駐しています.',13,10,0
  10186. already_mesZ:    dc.b    'Z-MUSIC PERFORMANCE MANAGER was already included.',13,10,0
  10187.         dc.b    'Z-MUSIC演奏マネージャはすでに常駐しています.',13,10,0
  10188. already_mes2:    dc.b    "An unidentified ADPCM driver has been included.",13,10,0
  10189.         dc.b    '認識不可能のADPCMドライバが常駐しています.',13,10,0
  10190. already_mes_mp:    dc.b    'MPCM denies Z-MUSIC occupation.',13,10,0
  10191.         dc.b    'MPCMがZMUSICによる占有を拒否しました.',13,10,0
  10192. out_mem_mes:    dc.b    'Out of memory error.',13,10,0
  10193.         dc.b    'メモリが不足しています.',13,10,0
  10194. devoffline_mes:    dc.b    'Interface Device is not ready.',13,10,0
  10195.         dc.b    '未接続のインターフェースを指定しました.',13,10,0
  10196. redefinit_mes:    dc.b    'Interface Device sequence error.',13,10,0
  10197.         dc.b    '同一インターフェースを複数回指定しました.',13,10,0
  10198. os_too_old_mes:    dc.b    "Z-MUSIC SYSTEM ver.3.0 runs on Human68k ver.3.00 and over.",13,10,0
  10199.         dc.b    'Z-MUSICシステム ver.3.0はHuman68k ver.3.00以上で動作します.',13,10,0
  10200. cannot_reg:    dc.b    13,10,'ZMSC3.X cannot be registered from CONFIG.SYS.',13,10,0
  10201. cannot_reg_j:    dc.b    13,10,'ZMSC3.XはCONFIG.SYSから登録することは出来ません.',13,10,0
  10202. kakuho_mes:    dc.b    'kByte(s)',$1b,'[m ',0
  10203. *atrb_0010:    dc.b    $1b,'[32m',0
  10204. tm___mes:    dc.b    'TEMPO SOURCE:',0
  10205. tm_a_mes:    dc.b    'YM2151 TIMER A',13,10,0
  10206. tm_b_mes:    dc.b    'YM2151 TIMER B',13,10,0
  10207. tm_m_mes:    dc.b    'YM3802 TIMER',13,10,0
  10208. *atrb_rev:    dc.b    $1b,'[m',13,10,0
  10209. mif_bar:    dc.b    'MIDI INTERFACE ',0
  10210. mif_tbl:    dc.b    'YM3802-1',13,10,0
  10211.         dc.b    'YM3802-2',13,10,0
  10212.         dc.b    'RS-MIDI1',13,10,0
  10213.         dc.b    'RS-MIDI2',13,10,0
  10214. sq_m_mes0:    dc.b    'External MIDI devices will be synchronized with Z-MUSIC.',13,10,0
  10215.         dc.b    '外部MIDI機器がZ-MUSICと同期します.',13,10,0
  10216. sq_m_mes1:    dc.b    'Z-MUSIC will be synchronized with External MIDI devices.',13,10,0
  10217.         dc.b    'Z-MUSICが外部MIDI機器と同期します.',13,10,0
  10218. kaijo:        dc.b    'Z-MUSIC PERFORMANCE MANAGER has been released from the system.',13,10,0
  10219.         dc.b    'Z-MUSIC演奏マネージャは常駐解除されました.',13,10,0
  10220. not_kep_mes:    dc.b    'Z-MUSIC PERFORMANCE MANAGER is not kept in the system.',13,10,0
  10221.         dc.b    'Z-MUSIC演奏マネージャは常駐していません.',13,10,0
  10222. rls_er_mes:    dc.b    'Z-MUSIC PERFORMANCE MANAGER is unable to release.',13,10,0
  10223.         dc.b    'Z-MUSIC演奏マネージャは常駐解除できません.',13,10,0
  10224. ocp_zc_er_mes:    dc.b    'Z-MUSIC COMPILER is occupied by some other application.',13,10,0
  10225.         dc.b    'Z-MUSICコンパイラが他のアプリケーションに占有されています.',13,10,0
  10226. ocp_zm_er_mes:    dc.b    'Z-MUSIC PERFORMANCE MANAGER is occupied by some other application.',13,10,0
  10227.         dc.b    'Z-MUSIC演奏マネージャが他のアプリケーションに占有されています.',13,10,0
  10228. ver_er_mes:    dc.b    'Illegal version number. Unable to release.',13,10,0
  10229.         dc.b    'バージョンが異なるため常駐解除はできません.',13,10,0
  10230. unknown_mes:    dc.b    'Unknown error.',13,10,0
  10231.         dc.b    '正体不明のエラーです.',13,10,0
  10232. help_mes:
  10233.     dc.b    '< USAGE >'
  10234.     dc.b    ' ZMSC.X [Optional Switches]',13,10
  10235.     dc.b    '< OPTIONAL SWITCHES >',13,10
  10236.     dc.b    '-? or H      Display the list of optional switches.',13,10
  10237.     dc.b    '-2           Ver.2.0 compatible mode.',13,10
  10238.     dc.b    '-A           Make Z-MUSIC work under OPM・TIMER-A.',13,10
  10239.     dc.b    '-B           Make Z-MUSIC work under OPM・TIMER-B.',13,10
  10240.     dc.b    '-C           Single RS232C-MIDI mode.',13,10
  10241.     dc.b    '-E           Synchronize an external MIDI sequencer.',13,10
  10242.     dc.b    '-F<n>        Prepare n tracks for sound effect mode.(default=0)',13,10
  10243.     dc.b    '-G           No message will be displayed.',13,10
  10244.     dc.b    '-I<n>        Establish the sequence of MIDI I/F.(default=1234)',13,10
  10245.     dc.b    '-J           Messages will be displayed in Japanese.',13,10
  10246.     dc.b    '-N           No initializing mode.',13,10
  10247.     dc.b    '-P           Disable to send polyphonic pressure message.',13,10
  10248.     dc.b    '-R           Release Z-MUSIC from the system.',13,10
  10249.     dc.b    '-S<filename> Include start-up file.',13,10
  10250.     dc.b    '-W           Dual RS232C-MIDI mode.',13,10
  10251.     dc.b    '-X<n>        Wait n/60[sec.] after sending EOX.(default=3)',13,10
  10252.     dc.b    '-Y<n>        Set Time Valiable of SCC(RS-MIDI).(default=3)',13,10
  10253.     dc.b    '-Z<filename> Include ZPD(ADPCM block data).',13,10
  10254.     dc.b    0
  10255.     dc.b    '< 使用方法 >'
  10256.     dc.b    ' ZMSC.X [Optional Switches]',13,10
  10257.     dc.b    '< オプションスイッチ >',13,10
  10258.     dc.b    '-? or H      ヘルプ表示.',13,10
  10259.     dc.b    '-2           Ver.2.0コンパチモード',13,10
  10260.     dc.b    '-A           演奏制御割り込みにOPM・TIMER-Aを使用します.',13,10
  10261.     dc.b    '-B           演奏制御割り込みにOPM・TIMER-Bを使用します.',13,10
  10262.     dc.b    '-C           シングルRS232C-MIDIモード',13,10
  10263.     dc.b    '-E           外部MIDI機器をZ-MUSICと同期させます.',13,10
  10264.     dc.b    '-F<n>        効果音トラックとしてnトラック確保します.(default=0).',13,10
  10265.     dc.b    '-G           メッセージを表示しません',13,10
  10266.     dc.b    '-I<n>        使用するMIDI I/Fの順序を定義します.(deault=1234)',13,10
  10267.     dc.b    '-J           日本語メッセージモード.',13,10
  10268.     dc.b    '-N           初期化なしモード.',13,10
  10269.     dc.b    '-P           ポリフォニックプレッシャーを送信しません.',13,10
  10270.     dc.b    '-R           Z-MUSICの常駐を解除します.',13,10
  10271.     dc.b    '-S<filename> スタートアップファイルを組み込みます.',13,10
  10272.     dc.b    '-W           デュアルRS232C-MIDIモード.',13,10
  10273.     dc.b    '-X<n>        EOX送信後n/60[sec.]待ちます.(default=3)',13,10
  10274.     dc.b    '-Y<n>        SCC(RS-MIDI)の時定数を設定します.(default=3)',13,10
  10275.     dc.b    '-Z<filename> ZPD(ADPCM block data)を組み込みます.',13,10
  10276.     dc.b    0
  10277. zmsc3_opt:    dc.b    'zmsc3_opt',0
  10278.     .even
  10279.  
  10280. exit_ooZ:
  10281.     lea    already_mesZ(pc),a1
  10282.     bra    err_exit
  10283. exit_oo:            *すでに常駐または常駐不可
  10284.     tst.l    d0
  10285.     bpl    @f
  10286.     lea    already_mes(pc),a1
  10287.     bra    err_exit
  10288. @@:
  10289.     lea    already_mes2(pc),a1    *COULDN'T SET INT ADPCM VECT
  10290.     subq.w    #1,d0
  10291.     beq    err_exit
  10292.     lea    already_mes_mp(pc),a1    *COULDN'T OCCUPY MPCM
  10293.     bra    err_exit
  10294.  
  10295. already_keptZ:
  10296.     lea    already_mesZ(pc),a1    *ZMUSIC already included
  10297.     bra    ak_prt
  10298. already_kept:
  10299.     tst.l    d0
  10300.     bpl    @f
  10301.     lea    already_mes(pc),a1    *COULDN'T SET ZMUSIC VECT
  10302.     bra    ak_prt
  10303. @@:
  10304.     lea    already_mes2(pc),a1    *COULDN'T SET INT ADPCM VECT
  10305.     subq.w    #1,d0
  10306.     beq    ak_prt
  10307.     lea    already_mes_mp(pc),a1    *COULDN'T OCCUPY MPCM
  10308. ak_prt:
  10309.     bsr    bil_prta1
  10310.     movem.l    (sp)+,d1-d7/a0-a6
  10311.     jmp    not_com
  10312.  
  10313. chk_optsw:                *スイッチ処理
  10314.     * < cmd_or_dev  0:device / $ff:command
  10315. chk_optsw_lp:
  10316.     move.b    (a4)+,d0
  10317.     beq    no_more?
  10318.     cmpi.b    #' ',d0
  10319.     beq    chk_optsw_lp
  10320.     cmpi.b    #'-',d0        *その他スイッチ処理へ
  10321.     beq    other_sw
  10322.     cmpi.b    #'/',d0
  10323.     beq    other_sw
  10324.     bra    chk_optsw_lp
  10325.  
  10326. no_more?:            *もうこれ以上スイッチは無しか
  10327.     rts
  10328.  
  10329. other_sw:            *その他のスイッチ
  10330.     move.b    (a4)+,d0
  10331.     beq    no_more?
  10332.     cmpi.b    #'?',d0        *diplay help message
  10333.     beq    prt_help
  10334.     cmpi.b    #'2',d0        *V2コンパチモードの設定
  10335.     beq    v2_compatible_mode
  10336.     jsr    mk_capital-work(a6)
  10337.     cmpi.b    #'A',d0        *timer a mode
  10338.     beq    set_timer_a_mode
  10339.     cmpi.b    #'B',d0        *timer_b mode
  10340.     beq    set_timer_b_mode
  10341.     cmpi.b    #'C',d0        *シングルRS232C-MIDI MODE
  10342.     beq    set_single_rs232c_mode
  10343.     cmpi.b    #'E',d0        *外部同期モード
  10344.     beq    synchro_on
  10345.     cmpi.b    #'F',d0        *効果音モードの設定
  10346.     beq    se_mode_cnf
  10347.     cmpi.b    #'G',d0        *タイトル表示なしモード
  10348.     beq    non_title
  10349.     cmpi.b    #'H',d0        *diplay help message
  10350.     beq    prt_help
  10351.     cmpi.b    #'I',d0        *MIDIインターフェースの設定
  10352.     beq    midi_assign
  10353.     cmpi.b    #'J',d0        *エラーメッセージの言語
  10354.     beq    set_err_lang
  10355.     cmpi.b    #'N',d0        *初期化無しモード
  10356.     beq    no_init
  10357.     cmpi.b    #'P',d0        *ポリフォニックプレッシャー無し
  10358.     beq    kill_poly_pres
  10359.     cmpi.b    #'R',d0        *解除
  10360.     beq    release
  10361.     cmpi.b    #'S',d0        *start up
  10362.     beq    start_up
  10363.     cmpi.b    #'V',d0        *チャンネルワークなしにする
  10364.     beq    kill_ch_wk
  10365.     cmpi.b    #'W',d0        *RS232C mode
  10366.     beq    set_dual_rs232c_mode
  10367.     cmpi.b    #'X',d0        *EOX wait
  10368.     beq    get_eoxw
  10369.     cmpi.b    #'Y',d0        *RS232C SCC 時定数設定
  10370.     beq    set_rs232c_bpsv
  10371.     cmpi.b    #'Z',d0        *ADPCM DATA READ
  10372.     beq    block_read
  10373.     bra    prt_help
  10374.  
  10375. kill_ch_wk:    *'-V'    (チャンネルワークを無効にする)
  10376.         *    (-1=all(default),0=kill fm(通常禁止),
  10377.         *      1=kill midi,2=kill all(通常禁止))
  10378.     clr.b    ch_wk_mode-work(a6)
  10379.     bsr    chk_num
  10380.     bmi    chk_optsw_lp
  10381.     bsr    asc_to_n
  10382.     move.b    d1,ch_wk_mode-work(a6)
  10383.     bra    chk_optsw_lp
  10384.  
  10385. se_mode_cnf:        *'-F'    (効果音トラックに何トラック使うか)
  10386.     move.w    #4,se_tr_max-work(a6)    *デフォルト=4
  10387.     bsr    chk_num
  10388.     bmi    chk_optsw_lp
  10389.     bsr    asc_to_n
  10390.     cmpi.l    #tr_max,d1
  10391.     bhi    chk_optsw_lp
  10392.     move.w    d1,se_tr_max-work(a6)
  10393.     bra    chk_optsw_lp
  10394.  
  10395. no_init:            *'-N'
  10396.     st.b    no_init_mode-work(a6)
  10397.     bra    chk_optsw_lp
  10398.  
  10399. kill_poly_pres:            *'-P'
  10400.     clr.b    polypress_mode-work(a6)
  10401.     bra    chk_optsw_lp
  10402.  
  10403. v2_compatible_mode:
  10404.     move.b    #2,zmsc_mode-work(a6)
  10405.     bra    chk_optsw_lp
  10406.  
  10407. set_dual_rs232c_mode:
  10408.     bset.b    #if_mr0,midi_board-work(a6)
  10409.     bset.b    #if_mr1,midi_board-work(a6)
  10410.     lea    midi_if_tbl-work(a6),a0
  10411. 1:                        *インターフェーステーブルにも登録
  10412.     move.b    (a0)+,d0
  10413.     bpl    1b
  10414.     cmpi.b    #-1,d0
  10415.     beq    1f
  10416.     cmpi.b    #$80+if_mr0*2,d0
  10417.     bne    @f
  10418.     move.b    #if_mr0*2,-1(a0)
  10419.     bra    1b
  10420. @@:
  10421.     cmpi.b    #$80+if_mr1*2,d0
  10422.     bne    1b
  10423.     move.b    #if_mr1*2,-1(a0)
  10424.     bra    1b
  10425. 1:
  10426.     tas.b    rs232c_mode-work(a6)        *dual
  10427.     move.l    #NOP_NOP,rs_check_patch
  10428.     jsr    cache_flush-work(a6)
  10429.     bra    chk_optsw_lp
  10430.  
  10431. set_single_rs232c_mode:
  10432.     bset.b    #if_mr0,midi_board-work(a6)
  10433.     lea    midi_if_tbl-work(a6),a0
  10434. 1:                        *インターフェーステーブルにも登録
  10435.     move.b    (a0)+,d0
  10436.     bpl    1b
  10437.     cmpi.b    #-1,d0
  10438.     beq    1f
  10439.     cmpi.b    #$80+if_mr0*2,d0
  10440.     bne    1b
  10441.     move.b    #if_mr0*2,-1(a0)
  10442.     bra    1b
  10443. 1:
  10444.     bclr.b    #7,rs232c_mode-work(a6)        *single
  10445.     bne    prt_help            *すでに-Wを指定しているのにおかしい
  10446.     move.l    #NOP_NOP,rs_check_patch
  10447.     jsr    cache_flush-work(a6)
  10448.     bra    chk_optsw_lp
  10449.  
  10450. set_rs232c_bpsv:
  10451.     bsr    chk_num
  10452.     bmi    prt_help
  10453.     cmpi.b    #'-',(a4)
  10454.     beq    prt_help
  10455.     bsr    asc_to_n
  10456.     andi.b    #$0f,d1
  10457.     move.b    d1,bps_v
  10458.     or.b    d1,rs232c_mode-work(a6)        *一応格納
  10459.     bra    chk_optsw_lp
  10460.  
  10461. non_title:
  10462.     move.l    #$7000_4e75,d0            *moveq.l #0,d0
  10463.                         *rts
  10464.     move.l    d0,prt_title            *タイトル
  10465.     move.w    d0,prt_keep_info        *常駐ステータス
  10466.     move.w    d0,dbrp                *ADPCMデータ読み込みメッセージ
  10467.     move.w    d0,surp                *スタートアップファイル
  10468.     move.w    d0,release_mes            *解除
  10469.     jsr    cache_flush-work(a6)
  10470.     bra    chk_optsw_lp
  10471.  
  10472. set_timer_a_mode:    *'A'
  10473.     st.b    timer_mode-work(a6)
  10474.     bra    chk_optsw_lp
  10475.  
  10476. set_timer_b_mode:    *'B'(MIDIボード装着時にもFM-TIMERを設定したい場合)
  10477.     clr.b    timer_mode-work(a6)
  10478.     bra    chk_optsw_lp
  10479.  
  10480. midi_assign:
  10481.     lea    midi_if_tbl-work(a6),a0
  10482.     moveq.l    #0,d1
  10483.     moveq.l    #if_max-1,d2
  10484. mdaslp:
  10485.     bsr    chk_num
  10486.     bmi    1f
  10487.     move.b    (a4),d0
  10488.     sub.b    #'1',d0
  10489.     bmi    1f        *MIDIインターフェースは使用しない
  10490.     cmpi.b    #if_max-1,d0
  10491.     bhi    prt_help    *異常なインターフェース番号を指定している
  10492.     cmpi.b    #if_mr0,d0
  10493.     bcs    @f
  10494.     cmpi.b    #if_mr1,d0
  10495.     bhi    @f
  10496.     bset.b    d0,midi_board-work(a6)
  10497.     move.l    #NOP_NOP,rs_check_patch
  10498.     jsr    cache_flush-work(a6)
  10499. @@:
  10500.     addq.w    #1,a4
  10501.     bset.l    d0,d1
  10502.     bne    3f        *同じインターフェース番号を指定している
  10503.     btst.b    d0,midi_board-work(a6)
  10504.     beq    4f        *異常なインターフェース番号を指定している
  10505.     add.b    d0,d0
  10506.     move.b    d0,(a0)+
  10507.     dbra    d2,mdaslp
  10508. 1:
  10509.     move.b    d1,available_device-work(a6)
  10510. *    move.b    d1,midi_board-work(a6)
  10511.     st.b    (a0)
  10512.     moveq.l    #0,d0
  10513. 2:
  10514.     lea    midi_if_tbl-work(a6),a0
  10515. @@:
  10516.     move.b    (a0)+,d1
  10517.     cmpi.b    #-1,d1
  10518.     beq    @f
  10519.     cmp.b    d1,d0
  10520.     bne    @b
  10521.     bra    1f
  10522. @@:
  10523.     move.b    d0,d2
  10524.     tas.b    d2
  10525.     st.b    (a0)
  10526.     move.b    d2,-(a0)
  10527. 1:
  10528.     addq.w    #2,d0
  10529.     cmpi.w    #if_max*2,d0
  10530.     bcs    2b
  10531.     bra    chk_optsw_lp
  10532. 3:
  10533.     lea    redefinit_mes(pc),a1
  10534.     bra    err_exit
  10535. 4:
  10536.     lea    devoffline_mes(pc),a1
  10537.     bra    err_exit
  10538.  
  10539. set_err_lang:                *エラーメッセージの言語選択
  10540.     move.b    #1,errmes_lang-work(a6)    *1:Japanese
  10541.     bra    chk_optsw_lp
  10542.  
  10543. synchro_on:                *nmdb!!
  10544.     bsr    chk_num
  10545.     bmi    @f
  10546.     bsr    asc_to_n        *外部シーケンサがホスト
  10547.     andi.b    #$0f,d1
  10548.     beq    @f
  10549.     ori.b    #%0011_0000,d1        *R75への書きだしデータとして形成
  10550.     move.b    d1,itpl_rate-work(a6)
  10551.     move.b    #2,timer_mode-work(a6)
  10552. @@:                    *X680x0がホストモード
  10553.     st.b    synchro_mode-work(a6)
  10554.     bra    chk_optsw_lp
  10555.  
  10556. block_read:
  10557. brlp00:
  10558.     move.b    (a4)+,d0    *SPCをスキップ
  10559.     beq    no_more?
  10560.     cmpi.b    #' ',d0
  10561.     bls    brlp00
  10562.     subq.w    #1,a4
  10563.     lea    stup_zpdfn-work(a6),a0
  10564.     bsr    copy_fn
  10565.     lea    stup_zpdfn-work(a6),a0
  10566.     lea    ZPD-work(a6),a1
  10567.     jsr    kakuchoshi-work(a6)
  10568.  
  10569.     lea    stup_zpdfn-work(a6),a2
  10570.     bsr    open_and_size
  10571.     bmi    non_jochu
  10572.     st.b    pcm_read_flg-work(a6)    *flag set
  10573.     bra    chk_optsw_lp
  10574.  
  10575. copy_fn:            *ファイルネームをバッファへ転送
  10576.     * < a0.l=destination address
  10577.     * < a4=address
  10578.     * > d1.b=minus 拡張子がある
  10579.     * > d1.b=plus 拡張子はなかった
  10580.     * - all except d1,a4
  10581.     movem.l    d0/d2/a0,-(sp)
  10582.     moveq.l    #0,d1
  10583.     moveq.l    #0,d2
  10584. copy_fnlp01:
  10585.     move.b    (a4)+,d0
  10586.     cmpi.b    #'.',d0
  10587.     bne    @f
  10588.     cmpi.b    #' ',(a4)
  10589.     bls    @f
  10590.     st.b    d1
  10591. @@:
  10592.     cmpi.b    #',',d0        *separater
  10593.     beq    exit_copyfn
  10594.     cmpi.b    #' ',d0        *ctrl code
  10595.     bls    exit_copyfn
  10596.     tst.b    d2
  10597.     beq    @f
  10598.     tst.b    -1(a0)
  10599.     bmi    cfst_lt
  10600. @@:
  10601.     jsr    mk_capital-work(a6)
  10602. cfst_lt:
  10603.     move.b    d0,(a0)+
  10604.     st.b    d2
  10605.     bra    copy_fnlp01
  10606. exit_copyfn:
  10607.     subq.w    #1,a4
  10608. exit_cfn:
  10609.     cmpi.b    #'.',-1(a0)
  10610.     bne    @f
  10611.     subq.w    #1,a0        *最後の'.'を潰す
  10612. @@:
  10613.     clr.b    (a0)
  10614.     movem.l    (sp)+,d0/d2/a0
  10615.     rts
  10616.  
  10617. non_jochu:
  10618.     jsr    play_beep-work(a6)
  10619.     bsr    mes_head
  10620.     lea    cannot_read-work(a6),a1    *エラーメッセージを表示して終了
  10621.     bra    err_exit
  10622.  
  10623. Human_ver_err:
  10624.     jsr    play_beep-work(a6)
  10625.     lea    os_too_old_mes(pc),a1
  10626.     bra    err_exit
  10627.  
  10628. resigned:
  10629.     jsr    play_beep-work(a6)
  10630.     lea    out_mem_mes(pc),a1
  10631.     bra    err_exit
  10632.  
  10633. open_and_size:
  10634.     * < a2.l=file name pointer
  10635.     * X d0,d3,d5
  10636.     jsr    fopen-work(a6)    *<a2.l=file name,(ret:d5=file handle)
  10637.     tst.l    d5        *d5=file_handle
  10638.     bmi    oas_err
  10639.     jsr    do_fclose-work(a6)
  10640.     moveq.l    #0,d0
  10641.     rts
  10642. oas_err:
  10643.     moveq.l    #-1,d0
  10644.     rts
  10645.  
  10646. start_up:
  10647. sulp00:
  10648.     move.b    (a4)+,d0    *SPCをスキップ
  10649.     beq    no_more?    *手抜き(case:command)
  10650.     cmpi.b    #' ',d0
  10651.     bls    sulp00
  10652.     subq.w    #1,a4
  10653.     lea.l    stup_fnsv-work(a6),a0
  10654.     moveq.l    #96-1,d1
  10655. sulp01:                *ファイルネームのゲット
  10656.     move.b    (a4)+,d0
  10657.     cmpi.b    #' ',d0
  10658.     bls    @f
  10659.     move.b    d0,(a0)+
  10660.     dbra    d1,sulp01
  10661. @@:
  10662.     subq.w    #1,a4
  10663.     clr.b    (a0)        *end code
  10664.  
  10665.     lea.l    stup_fnsv-work(a6),a2
  10666.     bsr    open_and_size
  10667.     bmi    _non_jochu
  10668.     st.b    stup_read_flg-work(a6)        *flag set
  10669.     bra    chk_optsw_lp
  10670.  
  10671. _non_jochu:
  10672.     bsr    prt_title
  10673.     jsr    play_beep-work(a6)
  10674.     bsr    mes_head2
  10675.     lea    cannot_read-work(a6),a1        *エラーメッセージを表示して終了
  10676.     bra    err_exit
  10677.  
  10678. get_eoxw:
  10679.     bsr    asc_to_n
  10680.     lea    eox_w-work(a6),a1
  10681.     rept    if_max
  10682.     move.w    d1,(a1)+
  10683.     endm
  10684.     bra    chk_optsw_lp
  10685.  
  10686. chk_num:            *数字かどうかチェック
  10687.     * > eq=number
  10688.     * > mi=not num
  10689.     move.l    d0,-(sp)
  10690.     bsr    skip_spc
  10691.     move.b    (a4),d0
  10692.     cmpi.b    #'%',d0
  10693.     beq    yes_num
  10694.     cmpi.b    #'$',d0
  10695.     beq    yes_num
  10696.     cmpi.b    #'-',d0
  10697.     beq    yes_num
  10698.     cmpi.b    #'+',d0
  10699.     beq    yes_num
  10700.     cmpi.b    #'0',d0
  10701.     bcs    not_num
  10702.     cmpi.b    #'9',d0
  10703.     bhi    not_num
  10704. yes_num:
  10705.     move.l    (sp)+,d0
  10706.     move.w    #CCR_ZERO,ccr
  10707.     rts
  10708. not_num:
  10709.     move.l    (sp)+,d0
  10710.     move.w    #CCR_NEGA,ccr
  10711.     rts
  10712.  
  10713. skip_spc:            *スペース/タブをスキップする
  10714.     cmpi.b    #' ',(a4)+
  10715.     beq    skip_spc
  10716.     cmpi.b    #09,-1(a4)    *skip tab
  10717.     beq    skip_spc
  10718.     subq.w    #1,a4
  10719. @@:
  10720.     rts
  10721.  
  10722. skip_plus:            *PLUSをスキップする
  10723.     cmpi.b    #'+',(a4)+
  10724.     beq    skip_plus
  10725.     subq.w    #1,a4
  10726. @@:
  10727.     rts
  10728.  
  10729. skip_sep:            *セパレータをスキップする(スペースやタブも)
  10730.     move.w    d0,-(sp)
  10731. skip_sep_lp:
  10732.     move.b    (a4)+,d0
  10733.     cmpi.b    #' ',d0
  10734.     beq    skip_sep_lp
  10735.     cmpi.b    #09,d0
  10736.     beq    skip_sep_lp
  10737.     cmpi.b    #',',d0
  10738.     beq    skip_sep_lp
  10739.     cmpi.b    #':',d0
  10740.     beq    skip_sep_lp
  10741.     cmpi.b    #'=',d0        *OPMD CNF FILEのケース
  10742.     beq    skip_sep_lp
  10743.     subq.w    #1,a4
  10744. @@:
  10745.     move.w    (sp)+,d0
  10746.     rts
  10747.  
  10748. asc_to_n:            *数字文字列を数値へ
  10749.     * < (a4)=number strings
  10750.     * > d1.l=value
  10751.     * > a4=next
  10752.     * x none
  10753.     bsr    skip_sep    *','などをskip
  10754.     movem.l    d2-d3,-(sp)
  10755.     cmpi.b    #'-',(a4)
  10756.     seq    d2           *'-'ならマーク
  10757.     bne    get_num0
  10758.     addq.w    #1,a4
  10759. get_num0:
  10760.     bsr    skip_plus
  10761.     bsr    skip_spc
  10762.  
  10763.     cmpi.b    #'$',(a4)
  10764.     beq    get_hexnum_
  10765.     cmpi.b    #'%',(a4)
  10766.     beq    get_binnum_
  10767.  
  10768.     moveq.l    #0,d1
  10769.     moveq.l    #0,d0
  10770. num_lp01:
  10771.     move.b    (a4)+,d0
  10772.     cmpi.b    #'_',d0
  10773.     beq    num_lp01
  10774.     sub.b    #$30,d0
  10775.     bmi    num_exit
  10776.     cmp.b    #9,d0
  10777.     bhi    num_exit
  10778.  
  10779.     add.l    d1,d1
  10780.     move.l    d1,d3
  10781.     lsl.l    #2,d1
  10782.     add.l    d3,d1        *d1=d1*10
  10783.     add.l    d0,d1        *d1=d1+d0
  10784.     bra    num_lp01
  10785. num_exit:
  10786.     subq.w    #1,a4
  10787.     tst.b    d2
  10788.     beq    @f
  10789.     neg.l    d1
  10790. @@:
  10791.     bsr    skip_sep
  10792.     movem.l    (sp)+,d2-d3
  10793. num_ret:
  10794.     rts
  10795. get_hexnum_:            *16進数
  10796.     moveq.l    #0,d0
  10797.     moveq.l    #0,d1
  10798.     addq.w    #1,a4
  10799.     bsr    skip_spc
  10800. __num_lp01_:
  10801.     move.b    (a4)+,d0
  10802.     cmpi.b    #'_',d0
  10803.     beq    __num_lp01_
  10804.     jsr    mk_capital-work(a6)
  10805.     sub.b    #$30,d0
  10806.     bmi    num_exit
  10807.     cmp.b    #9,d0
  10808.     bls    calc_hex_
  10809.     cmpi.b    #17,d0
  10810.     bcs    num_exit
  10811.     cmpi.b    #22,d0
  10812.     bhi    num_exit
  10813.     subq.b    #7,d0
  10814. calc_hex_:
  10815.     lsl.l    #4,d1
  10816.     or.b    d0,d1
  10817.     bra    __num_lp01_
  10818. get_binnum_:            *2進数
  10819.     moveq.l    #0,d0
  10820.     moveq.l    #0,d1
  10821.     addq.w    #1,a4
  10822.     bsr    skip_spc
  10823. b__num_lp01_:
  10824.     move.b    (a4)+,d0
  10825.     cmpi.b    #'_',d0
  10826.     beq    b__num_lp01_
  10827.     cmpi.b    #'0',d0
  10828.     beq    calc_b_num__
  10829.     cmpi.b    #'1',d0
  10830.     bne    num_exit
  10831. calc_b_num__:
  10832.     sub.b    #$30,d0
  10833.     add.l    d1,d1
  10834.     or.b    d0,d1
  10835.     bra    b__num_lp01_
  10836.  
  10837. set_vect:                *本デバイスドライバを拡張IOCSとして登録
  10838.     * > d0.l≠0ならエラー
  10839.     lea    $fe0000,a2
  10840.                     *MIDIタイマ使用か
  10841.     move.b    timer_mode-work(a6),d0    *1:MIDIタイマ
  10842.     ble    2f
  10843.     subq.b    #1,d0
  10844.     bne    extmmd            *2:
  10845.     move.l    $238.w,d0
  10846.     cmp.l    a2,d0
  10847.     bcs    3f            *すでに何かが占有中
  10848.     lea    int_entry_m-work(a6),a1
  10849.     move.l    a1,$238.w
  10850.     move.l    d0,mint_vect-work(a6)
  10851.     bra    1f
  10852. extmmd:                    *MIDIクロックモード
  10853.     move.l    $210.w,d0        *PlayBackCounter int
  10854.     cmp.l    a2,d0
  10855.     bcs    3f            *すでに何かが占有中
  10856.     move.l    $200.w,d1        *RealtimeMessageRecv int
  10857.     cmp.l    a2,d1
  10858.     bcs    3f
  10859.     lea    int_entry_e-work(a6),a1
  10860.     move.l    a1,$210.w
  10861.     move.l    d0,eint_vect-work(a6)
  10862.     lea    int_rm_ope-work(a6),a1
  10863.     move.l    a1,$200.w
  10864.     move.l    d1,rmint_vect-work(a6)
  10865. 1:
  10866.     tst.w    se_tr_max-work(a6)
  10867.     beq    _sv0
  10868.     bra    set_opmv
  10869. 2:
  10870.     cmp.l    $10c.w,a2
  10871.     bcs    set_opmv
  10872. 3:                    *すでに何かが占有中
  10873.     moveq.l    #-1,d0
  10874.     rts
  10875.  
  10876. set_opmv:
  10877.     st.b    opm_vect-work(a6)
  10878.     lea    int_entry_f-work(a6),a1
  10879.     IOCS    _OPMINTST
  10880. _sv0:
  10881.     move.l    $228.w,d0        *MIDI受信割り込みベクタ設定 #1
  10882.     cmp.l    a2,d0
  10883.     bcs    already_bye        *すでに何かが占有中
  10884.     lea    rec_int-work(a6),a1
  10885.     move.l    a1,$228.w
  10886.     move.l    d0,rec_vect-work(a6)
  10887.  
  10888.     move.l    $230.w,d0        *MIDI送信割り込みベクタ設定 #1
  10889.     cmp.l    a2,d0
  10890.     bcs    already_bye        *すでに何かが占有中
  10891.     lea    m_out_entry-work(a6),a1
  10892.     move.l    a1,$230.w
  10893.     move.l    d0,mot_vect-work(a6)
  10894.  
  10895.     move.l    $2a8.w,d0        *MIDI受信割り込みベクタ設定 #2
  10896.     cmp.l    a2,d0
  10897.     bcs    already_bye        *すでに何かが占有中
  10898.     lea    rec_int2-work(a6),a1
  10899.     move.l    a1,$2a8.w
  10900.     move.l    d0,rec_vect2-work(a6)
  10901.  
  10902.     move.l    $2b0.w,d0        *MIDI送信割り込みベクタ設定 #2
  10903.     cmp.l    a2,d0
  10904.     bcs    already_bye        *すでに何かが占有中
  10905.     lea    m_out_entry2-work(a6),a1
  10906.     move.l    a1,$2b0.w
  10907.     move.l    d0,mot_vect2-work(a6)
  10908.  
  10909.     btst.b    #if_mr0,midi_board-work(a6)
  10910.     beq    set_advct
  10911.                     *RS-MIDIベクタの設定
  10912.     lea    $160.w,a0
  10913.     cmp.l    (a0),a2
  10914. rs_check_patch:                *スイッチ-i3などでパッチが当たる(NOP*2)
  10915.     bhi    already_bye        *すでに何かが占有中
  10916.     move.w    sr,-(sp)
  10917.     ori.w    #$0700,sr
  10918.     lea    rs_vect-work(a6),a1
  10919.     moveq.l    #8-1,d0
  10920. @@:
  10921.     move.l    (a0)+,(a1)+
  10922.     dbra    d0,@b
  10923.  
  10924.     lea    $160.w,a1
  10925.     lea    m_out_entry_r-work(a6),a0
  10926.     move.l    a0,(a1)+
  10927.     move.l    a0,(a1)+
  10928.     lea    es_int-work(a6),a0
  10929.     move.l    a0,(a1)+
  10930.     move.l    a0,(a1)+
  10931.     lea    rec_int_r-work(a6),a0
  10932.     move.l    a0,(a1)+
  10933.     move.l    a0,(a1)+
  10934.     lea    sp_int-work(a6),a0
  10935.     move.l    a0,(a1)+
  10936.     move.l    a0,(a1)+
  10937.     move.w    (sp)+,sr
  10938. set_advct:                *ADPCMの停止処理の書き換え
  10939.     tst.b    ext_pcmdrv-work(a6)
  10940.     bne    @f
  10941.     lea    int_adpcm_stop,a1
  10942.     moveq.l    #$6a,d1
  10943.     IOCS    _B_INTVCS
  10944.     move.l    d0,adpcm_stop_v-work(a6)
  10945.     cmp.l    a2,d0
  10946.     bcs    already_bye_
  10947.  
  10948.     move.l    $84.w,d0
  10949.     cmp.l    a2,d0
  10950.     bcs    already_bye_
  10951.     move.l    d0,dummy_vect-work(a6)
  10952.     clr.l    $84.w
  10953.  
  10954.     lea    adpcmout,a1
  10955.     move.w    #$160,d1        *IOCS    _ADPCMOUTを乗っ取る
  10956.     IOCS    _B_INTVCS
  10957.     move.l    d0,adpcmout_v-work(a6)
  10958.  
  10959.     lea    adpcmmod-adpcmout(a1),a1
  10960.     move.w    #$167,d1        *IOCS    _ADPCMMODを乗っ取る
  10961.     IOCS    _B_INTVCS
  10962.     move.l    d0,adpcmmod_v-work(a6)
  10963.     bra    ocpy_trp3
  10964. @@:
  10965.     lea    ZMSC3_X-work(a6),a1
  10966.     move.w    #M_LOCK,d0
  10967.     MPCM_call
  10968.     tst.l    d0
  10969.     bne    already_bye_mpcm
  10970.     move.w    #M_INIT,d0
  10971.     MPCM_call
  10972.     lea    mpcm_vol_tbl-work(a6),a1
  10973.     moveq.l    #-1,d1
  10974.     move.w    #M_SET_VOLTBL,d0
  10975.     MPCM_call
  10976. ocpy_trp3:
  10977.     moveq.l    #35,d1        *trap #3を乗っ取る
  10978.     lea    Z_MUSIC_t3,a1
  10979.     IOCS    _B_INTVCS
  10980.     move.l    d0,sv_trap3-work(a6)
  10981. prt_title:                *タイトル表示(-GでRTSに)
  10982.     move.l    a1,-(sp)
  10983.     tst.b    title_mes
  10984.     beq    1f
  10985.     lea.l    title_mes(pc),a1        *常駐タイトル
  10986.     bsr    prta1
  10987.     clr.b    (a1)
  10988. 1:
  10989.     move.l    (sp)+,a1
  10990.     moveq.l    #0,d0            *no problem
  10991.     rts
  10992.  
  10993. already_bye_:            *ADPCM関連のベクタが占有されている
  10994.     moveq.l    #1,d0
  10995.     jmp    release_vectors-work(a6)
  10996. already_bye_mpcm:        *MPCM関連が占有されている
  10997.     clr.b    ext_pcmdrv-work(a6)
  10998.     moveq.l    #2,d0
  10999.     jmp    release_vectors-work(a6)
  11000. already_bye:            *ZMUSICで使用するベクタが占有されている
  11001.     moveq.l    #-1,d0
  11002.     jmp    release_vectors-work(a6)
  11003.  
  11004. chk_board:            *MIDIボードのチェック
  11005.     * - all
  11006. reglist    reg    d0/a0
  11007.     movem.l    reglist,-(sp)
  11008.     lea    midi_if_tbl-work(a6),a0
  11009.                 *MIDI I/F 0のチェック
  11010.     move.w    #1,-(sp)
  11011.     pea    icr
  11012.     pea    isr
  11013.     DOS    _BUS_ERR
  11014.     lea    10(sp),sp
  11015.     move.b    #$80+if_m0*2,(a0)+
  11016.     tst.l    d0
  11017.     bne    @f
  11018.     bset.b    #if_m0,midi_board-work(a6)
  11019.     move.b    #if_m0*2,-1(a0)
  11020.     move.b    #1,timer_mode-work(a6)    *MIDI TIMER(default)
  11021. @@:
  11022.                 *MIDI I/F 1のチェック
  11023.     move.w    #1,-(sp)
  11024.     pea    icr+$10
  11025.     pea    isr+$10
  11026.     DOS    _BUS_ERR
  11027.     lea    10(sp),sp
  11028.     move.b    #$80+if_m1*2,(a0)+
  11029.     tst.l    d0
  11030.     bne    @f
  11031.     bset.b    #if_m1,midi_board-work(a6)
  11032.     move.b    #if_m1*2,-1(a0)
  11033. @@:                *RS232C MIDI(標準装備)
  11034.     move.b    #$80+if_mr0*2,(a0)+
  11035.     cmp.l    #$fe0000,$160.w
  11036.     bcs    @f            *すでに何かが占有中
  11037.     bset.b    #if_mr0,midi_board-work(a6)
  11038.     move.b    #if_mr0*2,-1(a0)
  11039. @@:
  11040.     move.b    #$80+if_mr1*2,(a0)+
  11041.     st.b    (a0)
  11042.     move.b    midi_board-work(a6),available_device-work(a6)
  11043.     movem.l    (sp)+,reglist
  11044.     rts
  11045.  
  11046. set_dev_name:                *コマンドからドライバが実行された場合に
  11047.     lea    $6800,a0        *デバイス名 "OPM" を強制的に登録する
  11048. fdn_lp01:
  11049.     lea    NUL-work(a6),a2
  11050.     jsr    do_find-work(a6)
  11051.     cmpa.l    #NUL,a0
  11052.     bcc    err_fdn
  11053.     cmpi.w    #$8024,-18(a0)    *本当にNULか
  11054.     bne    fdn_lp01
  11055.     lea    -22(a0),a0
  11056. fdn_lp02:
  11057.     movea.l    a0,a1
  11058.     movea.l    (a1),a0        *最後尾を見付ける
  11059.     cmpa.l    #-1,a0
  11060.     bne    fdn_lp02
  11061.     lea    device_driver0,a0
  11062.     move.l    a0,(a1)
  11063.     moveq.l    #0,d0
  11064.     rts
  11065. err_fdn:
  11066.     moveq.l    #-1,d0
  11067.     rts
  11068.  
  11069. set_patch:                    *-a,-e,-i,-m スイッチ処理
  11070. reglist    reg    d0-d1/a0-a2
  11071.     move.w    sr,-(sp)
  11072.     ori.w    #$0700,sr
  11073.     movem.l    reglist,-(sp)
  11074.  
  11075.     lea    mode_patch_bkup-work(a6),a0
  11076.     move.w    pmod_wvmm_patch,(a0)+
  11077.     move.w    arcc_wvmm_patch,(a0)+
  11078.     move.w    frq_mpcm_patch,(a0)+
  11079.     move.w    datatype_mpcm_patch,(a0)+
  11080.     move.w    exit_gsg,(a0)+
  11081.     move.w    get_def_velo,(a0)+
  11082.  
  11083.     tst.b    rs232c_mode-work(a6)        *RS232C MIDIのパッチ
  11084.     bmi    @f                *-1,1の場合はデュアル
  11085.     patch_w    BRA,m_out_r0,m_out_r0_patch    *SINGLEの場合は$f5の送出禁止
  11086.     patch_w    BRA,m_out_r1,m_out_r1_patch
  11087. @@:
  11088.     move.l    $84.w,a0
  11089.     cmp.l    #'MPCM',-8(a0)
  11090.     seq    ext_pcmdrv-work(a6)
  11091.     bne    std_pcmdrv
  11092.                         *MPCM case
  11093.     patch_l2    BRA,adpcm_frq_patch0,frq_mpcm
  11094.     patch_l2    BRA,adpcm_pan_patch0,pan_mpcm
  11095.     patch_w2    BRA,sea1_patch,sea1_
  11096.     patch_w2    BRA,sea2_patch,sea2_
  11097.     move.w    #NOP,cfa_patch-work(a6)
  11098.     bra    @f
  11099. std_pcmdrv:                    *standard pcmdrv case
  11100.     patch_l2    BRA,pkon_patch0,single_pkon
  11101.     patch_l2    BRA,pkof_patch0,single_pkof
  11102.     patch_w        BRA,adii_patch,exit_adii
  11103.     patch_w        BPL,cmko_patch,koa_lp2
  11104.     patch_w2    BRA,mpcm_patch0,_mpcm_patch0
  11105.     patch_w        BRA,mpcm_patch1,_mpcm_patch1
  11106.     patch_w        BRA,mpcm_patch2,_mpcm_patch2
  11107.     move.w    #JMP,ako_ad_patch-work(a6)
  11108.     move.l    #adpcm_end,ako_ad_patch+2-work(a6)
  11109.     move.w    #RTS,do_ad_volume_-work(a6)
  11110.     move.w    #RTS,set_ad_tune
  11111. @@:
  11112.     move.l    #opmset,opmset_bsr_ms-work(a6)
  11113.     tst.w    se_tr_max-work(a6)
  11114.     beq    @f
  11115.     move.l    #opmset_se,opmset_bsr_ms-work(a6)
  11116.     bra    1f
  11117. @@:
  11118.     move.w    #RTS,play_zmd_se
  11119.     move.w    #RTS,se_play
  11120. 1:
  11121.     move.b    timer_mode-work(a6),d0        *タイマモードチェック
  11122.     bgt    tm_md_mode
  11123.     bmi    tm_a_mode
  11124. tm_b_mode:                    *タイマBモード
  11125.     patch_l    BRA,_init_timer,init_timer_b
  11126.     patch_l    BRA,stop_timer,stop_timer_b
  11127.     patch_l    BRA,init_timer_se,init_timer_a_se
  11128.     patch_l    BRA,stop_timer_se,stop_timer_a
  11129.     patch_l    BSR,calc_timer_patch,do_calc_tmb
  11130.     patch_l    BSR,calc_timer_se_patch,do_calc_tma
  11131.     patch_l    BSR,agogik_calctm,do_calc_tmb
  11132.     patch_l    BSR,agogik_calctm_se,do_calc_tma
  11133.     patch_l    BSR,go_calctm,do_calc_tmb
  11134.     patch_l    BSR,_go_calctm,do_calc_tma
  11135.     patch_w    BSR,tcg0,gyakusan_tm_b
  11136.     patch_w    BSR,_tcg0,gyakusan_tm_a
  11137.     patch_l    BSR,wrt_tmp,set_timer_b
  11138.     patch_l    BRA,_wrt_tmp,set_timer_a
  11139.     patch_x2    set_timer_value_patch,gyakusan_tm_b
  11140.     move.l    #gyakusan_tm_b,gyakusan_table+0-work(a6)
  11141.     move.l    #gyakusan_tm_a,gyakusan_table+4-work(a6)
  11142.     move.l    #int_entry_sub,tm_a_entry-work(a6)
  11143.     move.l    #int_entry_fm,tm_b_entry-work(a6)
  11144.     tst.w    se_tr_max-work(a6)
  11145.     bne    @f
  11146.                             *効果音演奏無し
  11147.     move.w    #%0000_1010,tm_a_reset-work(a6)
  11148.     move.w    #%0010_1010,tm_b_reset-work(a6)
  11149.     move.w    #%0010_1010,tm_ab_reset-work(a6)
  11150.     move.l    #int_dummy,sub_job_entry-work(a6)
  11151. @@:
  11152. *    move.l    #20*65536+5000,t_min-work(a6)        *t_min,t_max
  11153. *    move.l    #77*65536+32767,t_min_se-work(a6)    *t_min_se,t_max_se
  11154.     move.l    #$ff*65536+$3ff,_@t_max-work(a6)    *_@t_max,_@t_max_se
  11155.     patch_w    BRA,start_tm_int_ms,ei_tmf
  11156.     patch_w    BRA,stop_tm_int_ms,di_tmf
  11157.     bra    cpk_ope_patch
  11158. tm_a_mode:                    *タイマAモード
  11159.     patch_l    BRA,_init_timer,init_timer_a
  11160.     patch_l    BRA,stop_timer,stop_timer_a
  11161. *    patch_l    BRA,init_timer_se,init_timer_b_se
  11162. *    patch_l    BRA,stop_timer_se,stop_timer_b
  11163.     patch_l    BSR,calc_timer_patch,do_calc_tma
  11164.     patch_l    BSR,calc_timer_se_patch,do_calc_tmb
  11165.     patch_l    BSR,agogik_calctm,do_calc_tma
  11166. *    patch_l    BSR,agogik_calctm_se,do_calc_tmb
  11167.     patch_l    BSR,go_calctm,do_calc_tma
  11168. *    patch_l    BSR,_go_calctm,do_calc_tmb
  11169.     patch_w    BSR,tcg0,gyakusan_tm_a
  11170. *    patch_w    BSR,_tcg0,gyakusan_tm_b
  11171.     patch_l    BSR,wrt_tmp,set_timer_a
  11172. *    patch_l    BRA,_wrt_tmp,set_timer_b
  11173.     move.l    #gyakusan_tm_a,gyakusan_table+0-work(a6)
  11174. *    move.l    #gyakusan_tm_b,gyakusan_table+4-work(a6)
  11175.     patch_x2    set_timer_value_patch,gyakusan_tm_a
  11176.     tst.w    se_tr_max-work(a6)
  11177.     bne    @f
  11178.                             *効果音演奏無し
  11179.     move.w    #%0001_0101,tm_a_reset-work(a6)
  11180.     move.w    #%0000_0101,tm_b_reset-work(a6)
  11181.     move.w    #%0001_0101,tm_ab_reset-work(a6)
  11182.     move.l    #int_dummy,sub_job_entry-work(a6)
  11183. @@:
  11184. *    move.l    #77*65536+32767,t_min-work(a6)        *t_min,t_max
  11185. *    move.l    #20*65536+5000,t_min_se-work(a6)    *t_min_se,t_max_se
  11186.     move.l    #$3ff*65536+$ff,_@t_max-work(a6)    *_@t_max,_@t_max_se
  11187.     patch_w    BRA,start_tm_int_ms,ei_tmf
  11188.     patch_w    BRA,stop_tm_int_ms,di_tmf
  11189.     bra    cpk_ope_patch
  11190. tm_md_mode:                        *MIDIタイマーモード
  11191.     move.w    #%0000_1010,tm_a_reset-work(a6)        *OPMタイマは使うとしてもタイマBの方だけ
  11192.     move.w    #%0010_1010,tm_b_reset-work(a6)
  11193.     move.w    #%0010_1010,tm_ab_reset-work(a6)
  11194. *    move.l    #int_entry_sub,tm_b_entry-work(a6)
  11195.     move.l    #int_entry_sub,tm_ab_entry-work(a6)
  11196.     move.l    #NOP_NOP,ief_patch-work(a6)        *FM音源割り込み処理を無効化
  11197.     tst.w    se_tr_max-work(a6)
  11198.     bne    @f
  11199.     move.l    #int_dummy,sub_job_entry-work(a6)
  11200. @@:
  11201.     cmpi.b    #2,d0                    *< d0.b=timer_mode
  11202.     bne    cpk_ope_patch
  11203.                             *外部シーケンサホストケース
  11204.     patch_l    BRA,_init_timer,init_timer_e
  11205.  
  11206.     move.b    #%0011_1001,f8_start-work(a6)
  11207.     move.b    #%0010_1001,f8_stop-work(a6)
  11208.  
  11209.     patch_w2    BRA,mpp_fa0,_mpp_fa0
  11210.     patch_w2    BRA,mpp_fa1,_mpp_fa1
  11211.  
  11212.     patch_w    BRA,start_tm_int_ms,ei_tme
  11213.     patch_w    BRA,stop_tm_int_ms,di_tme
  11214. cpk_ope_patch:
  11215.     lea    copy_key-work(a6),a0
  11216.     move.l    $b0.w,copy_org-work(a6)
  11217.     move.l    a0,$b0.w            *copy key vect kill
  11218. ex_sync?:
  11219.     tst.b    synchro_mode-work(a6)        *外部シーケンサ同期モードか
  11220.     bne    @f                *非同期モード
  11221.     move.w    #RTS,m_tempo_patch
  11222.     move.w    #RTS,m_play_patch
  11223.     move.w    #RTS,m_stop_patch
  11224.     move.w    #RTS,m_cont_patch
  11225.     move.w    #RTS,_@t_midi_clk
  11226. @@:
  11227.     bsr    mdbd_patch
  11228.                         *チャンネルワークに関するパッチ
  11229.     move.b    ch_wk_mode-work(a6),d0
  11230.     beq    kill_fm_map            *ARS機能のみ機能させる(FM音源マップ処理は省略)
  11231.     bpl    @f
  11232.                         *全ての特殊処理を行う
  11233.     patch_l    BSR,m_out_m0_patch,midi_map_0
  11234.     patch_l    BSR,m_out_m1_patch,midi_map_1
  11235.     patch_l    BSR,m_out_r0_patch,midi_map_r0
  11236.     patch_l    BSR,m_out_r1_patch,midi_map_r1
  11237.  
  11238.     patch_w    BPL,(m_out_m0_patch+4),exit_ars0_
  11239.     patch_w    BPL,(m_out_m1_patch+4),exit_ars1_
  11240.     patch_w    BPL,(m_out_r0_patch+4),exit_arsr0_
  11241.     patch_w    BPL,(m_out_r1_patch+4),exit_arsr1_
  11242.  
  11243.     move.w    #RTS,m_out_m0_patch+6-work(a6)
  11244.     move.w    #RTS,m_out_m1_patch+6-work(a6)
  11245.     move.w    #RTS,m_out_r0_patch+6-work(a6)
  11246.     move.w    #RTS,m_out_r1_patch+6-work(a6)
  11247.     bra    reorder_mdif
  11248. @@:                        *MIDIチャンネルワーク/ARS両方の処理を省略
  11249.     patch_w    BRA,m_out_m0_patch,exit_ars0_
  11250.     patch_w    BRA,m_out_m1_patch,exit_ars1_
  11251.     patch_w    BRA,m_out_r0_patch,exit_arsr0_
  11252.     patch_w    BRA,m_out_r1_patch,exit_arsr1_
  11253.  
  11254.     patch_w2    BRA,init_midiwk,exit_mdwk    *init. ch wk
  11255.  
  11256.     subq.b    #1,d0            *case:d0=1 kill midi map only
  11257.     beq    reorder_mdif        *case:d0=2 kill all map
  11258. kill_fm_map:                *FM音源レジスタマップ処理の省略
  11259.     tst.w    se_tr_max-work(a6)    *(効果音モードが有効ならば無視)
  11260.     bne    @f
  11261.     move.l    exit_opmset-work(a6),opmset_patch1-work(a6)
  11262.     patch_w2    BRA,init_opmwk,exit_ifmwk    *init. ch wk
  11263. @@:
  11264.     tst.b    polypress_mode-work(a6)    *ポリフォニックプレッシャーを使用するか否か
  11265.     bne    reorder_mdif
  11266.     patch_w    BRA,poly_pressure_patch0,csm0
  11267.     patch_w    BRA,poly_pressure_patch1,psp0
  11268.     patch_w    BRA,poly_pressure_patch2,ppp0
  11269. reorder_mdif:
  11270.     lea    midi_if_tbl-work(a6),a1
  11271.     move.l    v_buffer-work(a6),a2
  11272.     moveq.l    #0,d0
  11273. rodrmdiflp:                *未接続I/F無効化
  11274.     move.b    (a1)+,d0
  11275.     bpl    @f
  11276.     cmpi.b    #-1,d0
  11277.     beq    1f
  11278.     add.b    d0,d0
  11279.     move.l    md_patch_tbl0(pc,d0.w),d1
  11280.     lea    md_patch_tbl0(pc,d1.l),a0
  11281.     move.w    #RTS,(a0)
  11282.     move.l    md_patch_tbl1(pc,d0.w),d1
  11283.     lea    md_patch_tbl1(pc,d1.l),a0
  11284.     move.w    #RTS,(a0)
  11285.     bra    rodrmdiflp
  11286. @@:
  11287.     move.b    d0,(a2)+
  11288.     bra    rodrmdiflp
  11289. 1:                    *並べ換え
  11290.     lea    midi_if_tbl-work(a6),a1
  11291. @@:
  11292.     move.b    (a1)+,d0
  11293.     bpl    @b
  11294.     move.b    d0,(a2)+
  11295.     cmpi.b    #-1,d0
  11296.     bne    @b
  11297.  
  11298.     move.l    v_buffer-work(a6),a1
  11299.     move.l    (a1)+,midi_if_tbl+0-work(a6)
  11300.     move.l    (a1)+,midi_if_tbl+4-work(a6)
  11301.  
  11302.     move.l    inc_zmint-work(a6),zi_inst-work(a6)    *obtain_events用
  11303.     jsr    cache_flush-work(a6)
  11304.     movem.l    (sp)+,reglist
  11305.     move.w    (sp)+,sr
  11306.     rts
  11307.  
  11308. md_patch_tbl0:
  11309.     dc.l    m_out_m0-md_patch_tbl0
  11310.     dc.l    m_out_m1-md_patch_tbl0
  11311.     dc.l    m_out_r0-md_patch_tbl0
  11312.     dc.l    m_out_r1-md_patch_tbl0
  11313.  
  11314. md_patch_tbl1:
  11315.     dc.l    _m_out_m0-md_patch_tbl1
  11316.     dc.l    _m_out_m1-md_patch_tbl1
  11317.     dc.l    _m_out_r0-md_patch_tbl1
  11318.     dc.l    _m_out_r1-md_patch_tbl1
  11319.  
  11320. reglist    reg    d0-d2/a0
  11321. mdbd_patch:                *MIDIインターフェースの有無の考慮
  11322.     movem.l    reglist,-(sp)
  11323.     tst.b    available_device-work(a6)
  11324.     bne    @f
  11325.     clr.l    current_midi_in_r-work(a6)    *MIDI出力を行わない時のみ初期化
  11326.     clr.l    current_midi_out_r-work(a6)    *MIDI出力を行わない時のみ初期化
  11327.     lea    nmdout_tbl(pc),a0    *MIDI出力を行わない
  11328.     bsr    do_ncp
  11329. @@:
  11330.     move.b    midi_board-work(a6),d0
  11331.     bne    mdbd2_patch
  11332.     lea    nmdb_tbl(pc),a0        *MIDIボード無しのケース
  11333.     bsr    do_ncp
  11334. mdbd2_patch:                *CZ6BM1 #2の有無の考慮
  11335.     btst.l    #if_m1,d0
  11336.     bne    exit_ncp
  11337.     lea    nmdb2_tbl(pc),a0    *MIDIボードは1枚のみ
  11338.     bsr    do_ncp
  11339. exit_ncp:
  11340.     movem.l    (sp)+,reglist
  11341.     rts
  11342.  
  11343. do_ncp:
  11344.     move.l    #BRA*65536,d1
  11345. dnlp00:
  11346.     move.l    (a0)+,d0
  11347.     beq    1f
  11348.     move.w    (a0)+,d1
  11349.     move.w    (a0)+,d2
  11350.     bne    @f
  11351.     move.l    d1,(a6,d0.l)
  11352.     bra    dnlp00
  11353. @@:                    *特殊ケース(RTSを埋めこむ場合など)
  11354.     move.w    d2,(a6,d0.l)
  11355.     bra    dnlp00
  11356. 1:
  11357.     rts
  11358.  
  11359. *    dc.w    書き換えアドレス先アドレス,ジャンプ先アドレス,0
  11360. *または
  11361. *    dc.w    書き換えアドレス先アドレス,0,パッチ命令
  11362.  
  11363. nmdout_tbl:            *MIDI出力を行わない場合のパッチ(MIDIボードはあるかも)
  11364.     patch    nmdb0,ok_com,0
  11365.     patch    ms_key_off_md,0,RTS
  11366.     patch    nmdb4,0,RTS
  11367.     patch    nmdb7,0,RTS
  11368.     patch    nmdb9,exit_ako0,0
  11369.     patch    nmdb10,su_not_ok,0
  11370.     patch    nmdb11,exit_pbm,0
  11371.     patch    midi_inp1,0,RTS
  11372.     patch    midi_out1,0,RTS
  11373.     patch    _m_out,0,RTS
  11374.     patch    get_m_out_addr,dummy_trans,0
  11375.     patch    current_midi_in,dummy_mdifret,0
  11376.     patch    current_midi_out,dummy_mdifret,0
  11377.     patch    set_eox_wait,0,RTS
  11378.     dc.l    0
  11379.  
  11380. nmdb_tbl:            *MIDIボードが1枚もない場合のパッチ
  11381.     patch    m_tempo_patch,0,RTS
  11382.     patch    m_play_patch,0,RTS
  11383.     patch    m_stop_patch,0,RTS
  11384.     patch    m_cont_patch,0,RTS
  11385.     patch    init_midibd,exit_i_mdbd,0
  11386.     patch    _@t_midi_clk,0,RTS
  11387.     dc.l    0
  11388.  
  11389. nmdb2_tbl:            *MIDIボードが2枚ない場合のパッチ
  11390.     patch    midi_clk2,midi_clk2_e,0
  11391.     patch    _mpp,t_dat_ok,0
  11392.     patch    _msp,t_dat_ok,0
  11393.     patch    _mcp,t_dat_ok,0
  11394.     dc.l    0
  11395.  
  11396. prt_help:            *簡易ヘルプの表示
  11397.     bsr    prt_title
  11398.     lea    help_mes(pc),a1
  11399.     bra    err_exit
  11400.  
  11401. *forbid_rs:            *RS232Cの使用禁止
  11402. *    movem.l    d0/d2/a0,-(sp)
  11403. *    andi.b    #%1111_0011,midi_board-work(a6)        *if_mr0,if_mr1
  11404. *    andi.b    #%1111_0011,available_device-work(a6)    *if_mr0,if_mr1
  11405. *1:
  11406. *    lea    midi_if_tbl-work(a6),a0
  11407. *    moveq.l    #if_max-1,d2
  11408. *@@:
  11409. *    move.b    (a0)+,d0
  11410. *    cmp.b    #if_mr0*2,d0
  11411. *    beq    @f
  11412. *    cmp.b    #if_mr1*2,d0
  11413. *    beq    @f
  11414. *    dbra    d2,@b
  11415. *    movem.l    (sp)+,d0/d2/a0
  11416. *    rts
  11417. *@@:
  11418. *    tas.b    -(a0)
  11419. *    bra    1b
  11420.  
  11421. get_work_area0:                *ワークエリアの確保
  11422.     * > a1.l=このプログラムの最終アドレス
  11423.     * > nz=out of memory
  11424.     * - all
  11425. v_b_len:    equ    1024
  11426. open_fn__:    equ    92
  11427.     lea.l    work_start0(pc),a1
  11428.     move.l    a1,v_buffer-work(a6)
  11429.     lea    v_b_len(a1),a1
  11430.  
  11431.     move.l    a1,filename-work(a6)
  11432.     lea    open_fn__(a1),a1
  11433.  
  11434.     move.l    a1,open_fn-work(a6)
  11435.     lea    open_fn__(a1),a1
  11436.  
  11437.     move.l    a1,dev_end_adr-work(a6)    *このプログラムの最終アドレス
  11438.     move.w    #1,-(sp)
  11439.     pea    (a1)
  11440.     pea    (a1)
  11441.     DOS    _BUS_ERR        *メモリを過剰使用していないか
  11442.     lea    10(sp),sp
  11443.     tst.l    d0
  11444.     rts
  11445.  
  11446. get_work_area1:                *ワークエリアの確保
  11447.     * > a1.l=このプログラムの最終アドレス
  11448.     * > nz=out of memory
  11449.     * - all
  11450. reglist    reg    d0-d1/a0
  11451. rand_frq:    equ    89*2
  11452.     movem.l    reglist,-(sp)
  11453.     move.l    dev_end_adr-work(a6),a1
  11454.     add.w    #128,a1            *seq_wk_tbl系ワークはベースアドレスよりも
  11455.     move.l    a1,dmy_seq_wk-work(a6)    *128バイト手前をアクセスすることがあるから
  11456.     lea    trwk_size(a1),a1
  11457.  
  11458.     move.l    a1,seq_wk_tbl_se-work(a6)
  11459.     move.w    se_tr_max-work(a6),d0
  11460.     mulu    #trwk_size,d0
  11461.     lea    -128(a1,d0.l),a1    *-128は上で足している分をもとに戻すことを意味する
  11462.  
  11463.     move.l    a1,play_trk_tbl_se-work(a6)
  11464.     move.w    #-1,(a1)
  11465.     move.w    se_tr_max-work(a6),d0
  11466.     beq    @f
  11467.     add.w    d0,d0                *×2バイト
  11468.     lea    (a1,d0.w),a1
  11469.     move.w    #-1,(a1)+            *end code
  11470. @@:
  11471.     move.l    a1,estbn-work(a6)
  11472.     lea    rand_frq(a1),a1
  11473.     move.l    a1,mr_max-work(a6)
  11474.  
  11475.     move.b    midi_board-work(a6),d0
  11476.     beq    1f
  11477.     lea    m_buffer_0-work(a6),a0    *MIDI送信バッファ等の確保
  11478.     moveq.l    #if_max-1,d1
  11479. gwlp0:
  11480.     lsr.w    #1,d0
  11481.     bcc    @f
  11482.     move.l    a1,(a0)
  11483.     clr.l    m_buffer_sp(a1)        *m_buffer_sp,m_buffer_ip
  11484.     clr.w    m_len(a1)        *m_len
  11485.     lea    m_buffer_end-m_buffer_start(a1),a1
  11486.     move.l    a1,rec_buffer_0-m_buffer_0(a0)
  11487.     clr.l    rec_write_ptr(a1)    *rec_write_ptr,rec_read_ptr
  11488.     clr.w    rec_buf_err(a1)        *rec_buf_err,rec_buf_stat
  11489.     lea    rec_buffer_end-rec_buffer_start(a1),a1
  11490.     tst.b    ch_wk_mode-work(a6)
  11491.     bgt    @f
  11492.     move.l    a1,mm0_adr-m_buffer_0(a0)
  11493.     lea    chwklen*16(a1),a1
  11494. @@:
  11495.     addq.w    #4,a0
  11496.     dbra    d1,gwlp0
  11497. 1:
  11498.     move.l    a1,dev_end_adr-work(a6)    *このプログラムの最終アドレス
  11499.     move.w    #1,-(sp)
  11500.     pea    (a1)
  11501.     pea    (a1)
  11502.     DOS    _BUS_ERR        *メモリを過剰使用していないか
  11503.     lea    10(sp),sp
  11504.     tst.l    d0
  11505.     movem.l    (sp)+,reglist
  11506.     rts
  11507.  
  11508. prt_keep_info:                *常駐インフォーメーション(-GでRTSに)
  11509.     lea    midi_if_tbl-work(a6),a0
  11510.     moveq.l    #0,d1
  11511.     moveq.l    #0,d2
  11512. @@:
  11513.     move.b    (a0)+,d1
  11514.     bmi    @f
  11515.     lea    mif_bar(pc),a1
  11516.     bsr    prta1
  11517.     move.l    d2,d0
  11518.     add.b    #'1',d0
  11519.     lea    suji-work(a6),a1
  11520.     move.b    d0,(a1)
  11521.     move.b    #':',1(a1)
  11522.     clr.b    2(a1)
  11523.     bsr    prta1            *BAR
  11524.     lsr.b    #1,d1            *1/2倍して(0-3)
  11525.     mulu    #11,d1
  11526.     lea    mif_tbl(pc),a1
  11527.     add.w    d1,a1
  11528.     jsr    prta1            *I/F TYPE
  11529.     addq.w    #1,d2
  11530.     bra    @b
  11531. @@:                    *タイマータイプ
  11532.     lea    tm___mes(pc),a1
  11533.     jsr    prta1-tm___mes(a1)
  11534.     lea    tm_b_mes(pc),a1
  11535.     tst.b    timer_mode-work(a6)
  11536.     beq    @f
  11537.     bmi    tma_
  11538.     lea    tm_m_mes(pc),a1
  11539.     bra    @f
  11540. tma_:
  11541.     lea    tm_a_mes(pc),a1
  11542. @@:
  11543.     jsr    prta1
  11544.     tst.b    synchro_mode-work(a6)
  11545.     beq    1f
  11546.     lea    sq_m_mes0(pc),a1
  11547.     cmpi.b    #2,timer_mode-work(a6)
  11548.     bne    @f
  11549.     lea    sq_m_mes1(pc),a1
  11550. @@:
  11551.     jbsr    bil_prta1
  11552. 1:
  11553. nmdb11:                    *nmdb!!(bra exit_pbm)
  11554.     lea    yes_midi(pc),a1        *"MIDI/"
  11555.     bsr    prta1
  11556. exit_pbm:
  11557.     lea    no_midi(pc),a1
  11558.     tst.b    ext_pcmdrv-work(a6)
  11559.     beq    bil_prta1
  11560.     lea    no_midi_(pc),a1        *MPCM case
  11561.     bra    bil_prta1
  11562.  
  11563. release:                *解除処理
  11564.     bsr    kep_chk            *常駐check
  11565.     bmi    not_kep            *常駐していない
  11566.     bne    illegal_ver        *バージョンが違う
  11567.  
  11568.     moveq.l    #ZM_OCCUPY_COMPILER,d1    *コンパイラがいるかどうかチェック
  11569.     lea    -1.w,a1
  11570.     Z_MUSIC    #ZM_HOOK_FNC_SERVICE
  11571.     move.l    a0,d0
  11572.     beq    @f
  11573.     moveq.l    #-1,d1            *ask
  11574.     Z_MUSIC    #ZM_OCCUPY_COMPILER
  11575.     tst.l    d0
  11576.     bne    case_compiler_occupied
  11577. @@:
  11578.     moveq.l    #-1,d1            *ask
  11579.     Z_MUSIC    #ZM_OCCUPY_ZMUSIC
  11580.     tst.l    d0
  11581.     bne    case_zmusic_occupied
  11582.  
  11583.     Z_MUSIC    #ZM_RELEASE_DRIVER        *> a0.l=free address
  11584.     tst.l    d0
  11585.     bne    release_err
  11586.  
  11587.     pea    $10(a0)
  11588.     DOS    _MFREE
  11589.     addq.w    #4,sp
  11590.  
  11591.     bsr    prt_title
  11592.     bsr    release_mes
  11593.  
  11594.     move.l    ssp-work(a6),a1
  11595.     IOCS    _B_SUPER    *ユーザーモードへ戻る
  11596.  
  11597.     DOS    _EXIT
  11598.  
  11599. release_mes:
  11600.     lea    kaijo(pc),a1
  11601.     jmp    bil_prta1-kaijo(a1)
  11602.  
  11603. case_compiler_occupied:            *ZMUSIC-COMPILERは占有されているので解除不可能
  11604.     lea    ocp_zc_er_mes(pc),a1
  11605.     bra    err_exit
  11606.  
  11607. case_zmusic_occupied:            *ZMUSIC-DRIVERは占有されているので解除不可能
  11608.     lea    ocp_zm_er_mes(pc),a1
  11609.     bra    err_exit
  11610.  
  11611. illegal_ver:                *VERSIONが違う
  11612.     lea    ver_er_mes(pc),a1
  11613.     bra    err_exit
  11614.  
  11615. release_err:                *解除不能の状態
  11616.     lea    rls_er_mes(pc),a1
  11617.     bra    err_exit
  11618.  
  11619. not_kep:                *常駐していないのか
  11620.     bsr    chk_drv
  11621.     beq    release_err        *device=で登録されたため解除不能
  11622.     lea    not_kep_mes(pc),a1    *常駐していない
  11623.     bra    err_exit
  11624.  
  11625. chk_drv:            *デバイス名のcheck
  11626.     * > eq=exist
  11627.     * > mi=not exist
  11628.     * x a1
  11629.     move.l    $8c.w,a1
  11630.     subq.w    #8,a1
  11631.     cmpi.l    #'ZmuS',(a1)+
  11632.     bne    @f
  11633.     cmpi.w    #'iC',(a1)+
  11634.     bne    @f
  11635.     rts
  11636. @@:
  11637.     moveq.l    #-1,d0
  11638.     rts
  11639.  
  11640. kep_chk:            *分身が常駐しているか
  11641.     * > eq=exists
  11642.     * > ne=none
  11643.     * > a2work分身のアドレス
  11644.     move.l    a0work-work(a6),a0
  11645. @@:                *メモリポインタの先頭を求める
  11646.     move.l    (a0),d0
  11647.     beq    klop1
  11648.     move.l    d0,a0
  11649.     bra    @b
  11650. klop1:
  11651.     move.l    12(a0),d0    *次のメモリ管理ポインタ
  11652.     beq    err_chk
  11653.     movea.l    d0,a2
  11654.     cmpa.l    a0work-work(a6),a2
  11655.     beq    klop_nxt    *自分自身じゃ意味無い
  11656.     lea    version_id-begin_of_prog+$100(a2),a1
  11657.     lea    version_id,a0
  11658.     cmpm.l    (a1)+,(a0)+
  11659.     bne    klop_nxt
  11660.     cmpm.w    (a1)+,(a0)+
  11661.     bne    klop_nxt
  11662.     cmpm.w    (a1)+,(a0)+
  11663.     bne    wrong_ver
  11664.     move.l    a2,a2work-work(a6)
  11665.     moveq.l    #0,d0        *分身の存在を確認
  11666.     rts
  11667. klop_nxt:
  11668.     move.l    a2,a0
  11669.     bra    klop1        *どんどんさかのぼる
  11670. err_chk:            *分身は無かった
  11671.     moveq.l    #-1,d0
  11672.     rts
  11673. wrong_ver:            *バージョンが違う
  11674.     moveq.l    #1,d0
  11675.     rts
  11676.  
  11677. *end_of_prog:
  11678. work_start0:
  11679.     end    exec
  11680.